2009-02-24 10 views
33

Volevo un modello Django con 2 chiavi esterne dallo stesso tavolo. È una tabella degli eventi che ha 2 colonne per i dipendenti: "attore" e "destinatario". Ma ottengo questo errore:Modello Django con 2 chiavi esterne dallo stesso tavolo

Error: One or more models did not validate: tasks.task: Intermediary model TaskEvent has more than one foreign key to Employee, which is ambiguous and is not permitted.

C'è un modo migliore per modellarlo? Grazie

Penso di aggiungere un tavolo TaskEvent_to_Employee. Saranno presenti due record, uno per ciascuno dei due dipendenti relativi a ciascun TaskEvent. Qualcuno sa una soluzione più semplice?

+0

Puoi fornire le classi Modello che ti stanno dando questo problema? –

+2

possibile duplicato di [Come posso avere due chiavi esterne per lo stesso modello in Django?] (Http://stackoverflow.com/questions/543377/how-can-i-have-two-foreign-keys-to-the -same-model-in-django) –

+1

Possibile duplicato di [Come posso avere due chiavi esterne per lo stesso modello in Django?] (https://stackoverflow.com/questions/543377/how-can-i-have- two-foreign-keys-to-the-same-model-in-django) –

risposta

56

non l'ho ancora fatto, ma ho usato inspectdb per generare il file models.py da un DB esistente che fa esattamente questo - questo è ciò che inspectdb gettò indietro, così dovrebbe funzionare:

creator = models.ForeignKey(Users, null=True, related_name='creator') 
assignee = models.ForeignKey(Users, null=True, related_name='assignee') 

Spero che funzioni per voi - se così non fosse avrò anche un problema.

+2

Buona fortuna per il problema che avrai. : P – Josh

+4

In realtà funziona semplicemente ... –

+9

Non è related_name il collegamento al modello che contiene l'attributo utilizzando 'related_name', quindi nell'esempio sopra riportato non cambierebbe il related_name in 'createe', e 'assegnatario' dal momento che se qualcuno dovesse accedere ad un oggetto 'assegnatario' nel tuo esempio, otterrebbe il 'assegnatario'? – orokusaki

0

Il fatto che due colonne facciano parte di una tabella implica che i due campi sono correlati, pertanto non è l'ideale per fare riferimento a tali campi singolarmente. Il ForeignKey del modello dovrebbe essere la chiave primaria della tabella si fa riferimento:

event = models.ForeignKey('event') 

Si potrebbe quindi fare riferimento le colonne in quanto tale:

foo.event.actor 
foo.event.receiver 

Se si desidera si può anche cambiare il modo in cui il classe/modello fa riferimento agli attributi stranieri con proprietà. Nella classe si dovrebbe effettuare le seguenti operazioni:

@property 
def actor(self): 
    return self.event.actor 
@property 
def receiver(self): 
    return self.event.receiver 

Questo permetterebbe di chiamare poi foo.actor e foo.receiver ma credo che il più lungo, foo.event.actor sarebbe più divinatorio

6

dal messaggio di errore, suona come si sta cercando di mettere due chiavi esterne allo stesso oggetto su una tabella intermediata utilizzata tramite l'argomento through su ManyToManyField, documentation for which states:

When you set up the intermediary model, you explicitly specify foreign keys to the models that are involved in the ManyToMany relation. This explicit declaration defines how the two models are related.

There are a few restrictions on the intermediate model:

  • Your intermediate model must contain one - and only one - foreign key to the target model (this would be Person in our example). If you have more than one foreign key, a validation error will be raised.
  • Your intermediate model must contain one - and only one - foreign key to the source model (this would be Group in our example). If you have more than one foreign key, a validation error will be raised.