2012-12-20 64 views
16

我有以下代碼:如何有兩種模式互相引用的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) #<---- 

「關於」各成員的一個外鍵鏈接(誰是把它)。遊戲中的所有成員都有他們所在遊戲的「遊戲」外鍵。問題是,Django不會讓我在聲明它之前引用一個類,並且因爲我不能同時聲明它們...

編輯:要清除問題,請看下面的示例。如果有五個成員玩一個遊戲,那麼所有五個成員都會有遊戲的外鍵。另一方面,遊戲中會有一個外鍵給特定的成員,然後輪到它。

+3

可能不適合這裏,但在一般情況下,你可以創建一個ForeignKey到您未通過傳遞的名字尚未宣佈一類該類作爲一個字符串而不是類本身。 – mipadi

回答

29

Django documentation for the ForeignKey field狀態:

如果你需要創建一個尚未被定義的模型的關係,您可以使用該模型,而不是模型對象本身的名稱。

所以你的情況,這將是:

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

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

對我來說,不斷使用'ForeignKey','OneToOneField'和'ManyToManyField'的'app.model'表示法是非常好的做法。我已經使用它將模型文件拆分爲每個模型的一個文件,這更具可讀性。 –

+0

@SteveK這幫助我解決了循環導入問題,謝謝! – OrPo

+0

考慮到'null = False'默認參數,你會如何去保存這種關係? – jozxyqk

8

您不需要讓兩個模型用外鍵互相引用。刪除行:

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

和邏輯的Member的仍然會關聯到不同Game的(這更有意義,因爲成員可以同時屬於一個遊戲,而遊戲可以有更多的比一個成員)。

您可以使用reverse relation來確定哪些成員在特定遊戲中。

+1

我可能沒有讓我的情況清楚(或者我不理解你的答案)。如果你有5個成員全部玩一場比賽,他們都會參考同一場比賽。但是「關於」外鍵只會引用原來的人(單個成員)。 –