2012-12-20 4 views
16

Ich habe den folgenden Code:Wie haben zwei Modelle verweisen einander 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) #<---- 

Die „auf“ Fremdschlüssel Links zu einem der Mitglieder (wer drehen ist). Für alle Mitglieder eines Spiels ist der Fremdschlüssel "Spiel" auf das Spiel festgelegt, in dem sie sich befinden. Das Problem ist, dass Django mich nicht eine Klasse referenzieren lassen wird, bevor es deklariert wurde, und da ich sie nicht gleichzeitig deklarieren kann ...

Edit: Um Dinge zu klären, hier ein Beispiel. Wenn fünf Mitglieder ein Spiel spielen würden, hätten alle fünf Fremdschlüssel für das Spiel. Das Spiel auf der anderen Seite hätte einen Fremdschlüssel für das bestimmte Mitglied, das an der Reihe war.

+3

nicht angemessen hier sein könnte, aber im Allgemeinen können Sie eine ForeignKey zu einer Klasse erstellen Sie, indem Sie den Namen noch nicht erklärt haben, von die Klasse als String anstelle der Klasse selbst. – mipadi

Antwort

29

Die Django documentation for the ForeignKey field Zustände:

Wenn Sie eine Beziehung auf ein Modell erstellen, die noch nicht definiert wurde, können Sie den Namen des Modells, anstatt das Modellobjekt selbst verwenden können.

Also in Ihrem Fall, das wäre:

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

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

Für mich ist die Verwendung der ''app.model''-Notation für' ForeignKey', 'OneToOneField' und' ManyToManyField' eine sehr gute Übung. Ich habe das verwendet, um Modelldateien in eine Datei pro Modell aufzuteilen, die viel besser lesbar ist. –

+0

@SteveK Dies hat mir geholfen, ein zirkuläres Importproblem zu lösen, danke! – OrPo

+0

Wie würden Sie diese Beziehung speichern, wenn Sie die Standardargumente 'null = False' verwenden? – jozxyqk

8

Sie müssen die beiden Modelle nicht mit Fremdschlüsseln referenzieren. Entfernen Sie die Zeile:

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

und logisch Ihre Member s ‚s noch zu verschiedenen Game in Verbindung gebracht werden‘ (und das macht mehr Sinn, weil ein Mitglied zu einem Spiel zu einer Zeit gehören kann, während ein Spiel mehr hat als ein Mitglied).

Sie können reverse relation verwenden, um herauszufinden, welche Mitglieder in einem bestimmten Spiel sind.

+1

Ich habe wahrscheinlich meine Situation nicht klar gemacht (oder vielleicht verstehe ich deine Antwort nicht). Wenn Sie nur 5 Mitglieder hätten, die alle ein Spiel spielen, würden sie alle dasselbe Spiel referenzieren. Aber der "on" -Fremdschlüssel würde nur auf die Personen verweisen, die an der Reihe waren (ein einzelnes Mitglied). –