2012-12-20 11 views
16

ho il seguente codice:Come avere due modelli di riferimento tra loro Django

class Game(models.Model): 
    title = models.CharField(max_length=50) 
    summery = models.CharField(max_length=500) 
    key = models.IntegerField() 
    pin = models.CharField(max_length=12) 
    complete = models.BooleanField() 
    invite_sent = models.DateTimeField() 
    on = models.ForeignKey(Member, blank = True) #<---- 


class Member(models.Model): 
    email = models.CharField(max_length=100) 
    color = models.CharField(max_length=11) 
    game = models.ForeignKey(Game) #<---- 

La "su" collegamenti di chiave esterna a uno dei membri (che è il turno). Tutti i membri di un gioco hanno il loro tasto di gioco "straniero" impostato sul gioco in cui si trovano. Il problema è che Django non mi permetterà di fare riferimento a una classe prima che sia stata dichiarata, e dal momento che non posso dichiararli simultaneamente ...

Modifica: Per chiarire le cose, ecco un esempio. Se ci fossero cinque membri che giocavano in una partita, tutti e cinque avrebbero avuto chiavi straniere nel gioco. D'altra parte il gioco avrebbe una chiave straniera per quel particolare membro che è diventato.

+3

Potrebbe non essere appropriato qui, ma in generale, è possibile creare una ForeignKey a una classe non è ancora stato dichiarato dal passando il nome di la classe come una stringa invece della classe stessa. – mipadi

risposta

29

I Django documentation for the ForeignKey field stati:

Se è necessario creare una relazione su un modello che non è ancora stato definito, è possibile utilizzare il nome del modello, piuttosto che il modello dell'oggetto stesso.

Quindi nel tuo caso, che sarebbe:

class Game(models.Model): 
    # Other fields... 
    on = models.ForeignKey('Member', blank = True) 

class Member(models.Model): 
    # Other fields... 
    game = models.ForeignKey(Game) 
+2

Per me, l'uso costante della notazione ''app.model'' per' ForeignKey', 'OneToOneField' e' ManyToManyField' è un'ottima pratica. Ho usato questo per dividere i file dei modelli in un unico file per modello, che è molto più leggibile. –

+0

@SteveK Questo mi ha aiutato a risolvere un problema di importazione circolare, grazie! – OrPo

+0

Come procederesti a salvare questa relazione dato gli argomenti di default 'null = False'? – jozxyqk

8

Non è necessario che i due modelli si faccia riferimento l'un l'altro con chiavi esterne. Rimuovere la riga:

on = models.ForeignKey(Member, blank = True) #<---- 

e logicamente vostre Member 's sarà ancora essere associati a diversi Game' s (e questo rende più senso perché un membro può appartenere a una partita alla volta, mentre un gioco può avere più di un membro).

È possibile utilizzare reverse relation per capire quali membri si trovano in un determinato gioco.

+1

Probabilmente non ho chiarito la mia situazione (o forse non capisco la tua risposta). Se aveste per istanti 5 membri che giocavano tutti in una partita, tutti farebbero riferimento allo stesso gioco. Ma la chiave estranea "on" farebbe riferimento solo alle persone che hanno fatto il turno (un singolo membro). –

Problemi correlati