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?

35
demandé sur Ron 2009-02-24 23:00:11

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.

60
répondu Technical Bard 2009-06-30 05:11:22

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:

7
répondu Justin Abrahms 2018-03-26 07:21:13

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.
6
répondu Jonny Buchanan 2009-02-25 11:17:11

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

0
répondu awithrow 2009-02-24 20:19:46