如何让两个模型互相引用Django

sin*_*inθ 23 python django django-models models

我有以下代码:

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) #<----
Run Code Online (Sandbox Code Playgroud)

"on"外键链接到其中一个成员(转为它).游戏的所有成员都将他们的"游戏"外键设置为他们所在的游戏.问题是Django不会让我在声明它之前引用它,因为我不能同时声明它们......

编辑:为了清理,这是一个例子.如果有五个成员玩一个游戏,那么所有五个游戏都有外键.另一方面,游戏将有一个外键给特定成员转过来.

Bla*_*air 34

ForeignKey字段Django文档说明:

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

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

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

class Member(models.Model):
    # Other fields...
    game = models.ForeignKey(Game)
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,不断使用``ForeignKey`的''app.model'符号,`OneToOneField`和`ManyToManyField`是非常好的做法.我已经使用它将每个模型的模型文件拆分成一个文件,这个文件更具可读性. (2认同)
  • 给定 `null=False` 默认参数,你将如何保存这种关系? (2认同)

sam*_*hen 8

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

on = models.ForeignKey(Member, blank = True) #<----
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,你Member的仍然会与不同Game的人联系起来(这更有意义,因为一个成员一次可以属于一个游戏,而游戏可以有多个成员).

您可以使用反向关系来确定特定游戏中的成员.

  • 我很可能没有让我的情况清楚(或者我可能不理解你的答案).如果你有5个成员都玩一个游戏,他们都会参考同一个游戏.但是,"on"外键只会引用轮到它的人(单个成员). (3认同)