将ForeignKey放在Django中的哪些模型上有什么区别?

时间:2013-09-23 09:51:08

标签: django django-models

我知道这是一个非常基本的问题。假设我有两个模型:

class Quiz(models.Model):

    name = models.CharField(max_length=100)
    description = models.TextField()

class Question(models.Model):

    quiz = models.ForeignKey(Quiz)
    name = models.CharField(max_length=100)

在这里,一个测验可以包含许多问题,一个问题只属于一个测验。这就是ForeignKey关系有意义的原因。但不是这样,我可以这样做:

class Question(models.Model):

    name = models.CharField(max_length=100)
    description = models.TextField()

class Quiz(models.Model):

    question = models.ForeignKey(Question)
    name = models.CharField(max_length=100)

有什么区别?而且,我如何确定应该将ForeignKey放在哪个模型上。感谢

3 个答案:

答案 0 :(得分:1)

它真的是关于所有权。你需要问问自己,谁拥有哪些领域,或者这至少是我对此的看法。

在您的第一个示例中,Question属于Quiz模型,但在第二个示例中,Quiz模型归Question对象所有。

所以,这是一个应该问自己的简单问题,一个问题是属于许多测验还是一个测验有很多问题?由于Quiz是一个有很多问题的问题,你应该使用第一个问题。

查看ForeignKey上的文档。

答案 1 :(得分:1)

你自己说。在您的第一个片段中,一个问题属于一个测验,测验有很多问题。但是如果你把它移到另一个模型,关系也会改变:现在一个问题属于很多测验,测验只有一个问题。所以它取决于你想要建立一对多关系的“多”方面的模型:具有ForeignKey字段的那个是“很多”的那个。

答案 2 :(得分:0)

外键只是OnetoMany Field。

所以对于第一个片段,即

class Quiz(models.Model):

    name = models.CharField(max_length=100)
    description = models.TextField()

class Question(models.Model):
    quiz = models.ForeignKey(Quiz)
    name = models.CharField(max_length=100)

您可以使用一个问题标记测验。 但在第二个片段中,即

class Question(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

class Quiz(models.Model):
    question = models.ForeignKey(Question)
    name = models.CharField(max_length=100)

您可以将一个问题标记为多个测验。

您的要求是"一个测验可以包含许多问题"所以你应该使用第一个片段。

如果您使用第二个片段进行,那么一个问题与许多您不想做的测验有关。