Modèle Django avec 2 clés étrangères de la même table
je voulais un modèle Django avec 2 clés étrangères de la même table. C'est une table d'événement qui a 2 colonnes pour les employés: l'acteur et le récepteur. Mais j'ai cette erreur:
erreur: un ou plusieurs modèles n'ont pas validé: tasks.tâche: Intermédiaire modèle TaskEvent a plus d'une clé étrangère à l'Employé, qui est ambigu et n'est pas autorisée.
Est-il une meilleure façon de ce modèle? Merci
je pense que je vais l'ajouter TaskEvent_to_Employee
tableau. Il y aura deux dossiers, un pour chacune des deux employés liés à chaque TaskEvent
. Quelqu'un connais une solution plus facile?
4 réponses
je n'ai pas fait encore, mais j'ai utilisé inspectdb pour générer le models.py fichier à partir D'un DB existant qui fait exactement cela-c'est ce que inspectdb a renvoyé, donc il devrait fonctionner:
creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')
espérons que cela fonctionne pour vous - si ce n'est pas le cas, je vais avoir un problème aussi.
je pense que ce que vous recherchez est la propriété related_name sur ForeignKeyFields. Cela vous permettra de faire référence à la même table, mais donner django des noms spéciaux pour la relation.
Plus Info:
D'après le message d'erreur, on dirait que vous essayez de mettre deux clés étrangères du même objet sur une table intermédiaire utilisée via le through
argument ManyToManyField
, le documentation pour laquelle les États:
Lorsque vous configurez l'intermédiaire modèle, vous spécifiez explicitement l'étranger les clés des modèles impliqués dans la relation ManyToMany. Ce la déclaration explicite définit comment deux modèles sont liés.
Il y a un peu de restrictions sur les modèle intermédiaire:
- votre modèle intermédiaire doit contenir une - et une seule-clé étrangère le modèle cible (ce serait Personne dans notre exemple). Si vous avez plus d' une clé étrangère, une erreur de validation seront soulevées.
- votre modèle intermédiaire doit contenir une - et une seule-clé étrangère le modèle source (ce serait le Groupe dans notre exemple). Si vous avez plus d' une clé étrangère, une validation erreur seront soulevées.
le fait que deux colonnes font partie d'une même table implique que les deux champs sont liés, donc les référencer individuellement n'est pas idéal. La clé étrangère de votre modèle devrait être la clé primaire de la table que vous référencez:
event = models.ForeignKey('event')
vous référeriez alors les colonnes comme telles:
foo.event.actor
foo.event.receiver
si vous le souhaitez, vous pouvez également modifier la façon dont votre classe/modèle renvoie les attributs étrangers avec propriétés. Dans votre classe, vous ne le suivantes:
@property
def actor(self):
return self.event.actor
@property
def receiver(self):
return self.event.receiver
cela vous permettrait alors d'appeler foo.l'acteur et foo.récepteur mais je crois que plus longtemps, foo.événement.l'acteur serait plus pythonic