Le meilleur moyen et le plus efficace d'apprendre de nouvelles choses est de voir et d'étudier des exemples pratiques du monde réel. Supposons un instant que vous vouliez construire un blog en django où les journalistes peuvent écrire et publier des articles d'actualité. Le propriétaire du journal en ligne veut permettre à chacun de ses journalistes de publier autant d'articles qu'il le souhaite, mais ne veut pas que différents journalistes travaillent sur le même article. Cela signifie que lorsque les lecteurs vont lire un article, ils ne verront qu'un seul auteur dans l'article.
Par exemple : Article par John, Article par Harry, Article par Rick. Vous ne pouvez pas avoir un article par Harry et Rick parce que le patron ne veut pas que deux auteurs ou plus travaillent sur le même article.
Comment pouvons-nous résoudre ce "problème" avec l'aide de django ? La clé de la solution de ce problème est le django. ForeignKey
.
Ce qui suit est le code complet qui peut être utilisé pour mettre en œuvre l'idée de notre patron.
from django.db import models
# Create your models here.
class Reporter(models.Model):
first_name = models.CharField(max_length=30)
def __unicode__(self):
return self.first_name
class Article(models.Model):
title = models.CharField(max_length=100)
reporter = models.ForeignKey(Reporter)
def __unicode__(self):
return self.title
Exécuter python manage.py syncdb
pour exécuter le code SQL et créer les tables pour votre application dans votre base de données. Utilisez ensuite python manage.py shell
pour ouvrir un shell python.
Créer l'objet Reporter R1.
In [49]: from thepub.models import Reporter, Article
In [50]: R1 = Reporter(first_name='Rick')
In [51]: R1.save()
Créez l'objet Article A1.
In [5]: A1 = Article.objects.create(title='TDD In Django', reporter=R1)
In [6]: A1.save()
Utilisez ensuite le code suivant pour obtenir le nom du journaliste.
In [8]: A1.reporter.first_name
Out[8]: 'Rick'
Maintenant, créez l'objet Reporter R2 en exécutant le code python suivant.
In [9]: R2 = Reporter.objects.create(first_name='Harry')
In [10]: R2.save()
Essayez maintenant d'ajouter R2 à l'objet Article A1.
In [13]: A1.reporter.add(R2)
Cela ne fonctionne pas et vous obtiendrez un AttributeError indiquant que l'objet 'Reporter' n'a pas d'attribut 'add'.
Comme vous pouvez le constater, un objet Article ne peut être lié à plus d'un objet Rapporteur.
Qu'en est-il de R1 ? Peut-on y attacher plusieurs objets Article ?
In [14]: A2 = Article.objects.create(title='Python News', reporter=R1)
In [15]: R1.article_set.all()
Out[15]: [<Article: Python News>, <Article: TDD In Django>]
Cet exemple pratique nous montre que django ForeignKey
est utilisé pour définir les relations entre plusieurs personnes.
OneToOneField
est utilisé pour créer des relations de type "un à un".
Nous pouvons utiliser reporter = models.OneToOneField(Reporter)
dans le fichier models.py ci-dessus mais elle ne sera pas utile dans notre exemple car un auteur ne pourra pas publier plus d'un article.
Chaque fois que vous souhaitez publier un nouvel article, vous devez créer un nouvel objet Reporter. Cela prend du temps, n'est-ce pas ?
Je vous recommande vivement d'essayer l'exemple avec le OneToOneField
et de réaliser la différence. Je suis presque sûr qu'après cet exemple, vous connaîtrez parfaitement la différence entre django et les autres logiciels. OneToOneField
et django ForeignKey
.