40 votes

Dans Django, comment faire pour qu'un modèle se réfère à lui-même ?

Supposons que nous ayons la classe Employee. Je veux avoir un champ qui référence une instance différente de la même classe.

Comment écrire ça ? Qu'en est-il du code suivant ?

ref_employee= models.ForeignKey('self',null=True,blank=True)

77voto

insin Points 19509

http://docs.djangoproject.com/fr/dev/ref/models/fields/#foreignkey

Pour créer une relation récursive -- un objet qui a une relation de plusieurs à un avec lui-même -- utilisez models.ForeignKey('self').

Donc vous avez raison. Il est généralement plus rapide de déterminer si le code fera ce que vous voulez en l'exécutant :)

4voto

Stryker Points 1474

Je crois que vous pouvez même exclure le nom de l'application qui ressemblerait

ref_employee= models.ForeignKey('Employee',null=True,blank=True)

2voto

nelhage Points 1660

Vous pouvez référencer d'autres modèles par nom (en utilisant une chaîne, y compris le paquet), au lieu de par la classe directement :

Donc, si votre classe Employee est dans l'application hr :

class Employee(models.model):
   other_employee = models.ForeignKey('hr.models.Employee', null=True, blank=True)

2voto

AMIN Points 21

oui c'est correct mais considérez que vous devriez écrire 'null=True' car si vous ne le mentionnez pas,dans votre base de données créez de manière récursive une table conjointe

0voto

Une contrainte forçant id et ref_employee_id avoir des valeurs séparées sort du cadre de l'ORM de Django. Vous devrez ajouter ladite contrainte au niveau de la base de données, via SQL en syncdb ou manuellement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X