32

我有以下代码:

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不允许我在声明之前引用一个类,因为我不能同时声明它们......

编辑:为了澄清事情,这里有一个例子。如果有五个成员玩一个游戏,那么所有五个成员都将拥有该游戏的外键。另一方面,游戏将有一个外键指向轮到该特定成员的特定成员。

4

2 回答 2

55

ForeignKey 字段的Django 文档指出:

如果您需要在尚未定义的模型上创建关系,您可以使用模型的名称,而不是模型对象本身。

所以在你的情况下,那将是:

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

class Member(models.Model):
    # Other fields...
    game = models.ForeignKey(Game)
于 2012-12-20T20:18:16.100 回答
10

您不需要让两个模型使用外键相互引用。删除行:

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

从逻辑上讲,您Member的 's 仍将与不同Game的 's 相关联(这更有意义,因为一个成员一次可以属于一个游戏,而一个游戏可以有多个成员)。

您可以使用反向关系来确定哪些成员在特定游戏中。

于 2012-12-20T18:53:50.130 回答