在定义模型之前,先为模型定义ForeignKey

时间:2019-01-09 08:17:36

标签: python django python-3.x django-models

因此,在这种情况下,我需要在定义模型之前为模型创建外键。考虑以下模型:

class Question(models.Model):
    """Model for question."""

    question_text = models.TextField(blank=True, null=True)
    answer = models.ForeignKey(Option, on_delete=models.PROTECT)  # Can't do this


class Option(models.Model):
    """Model for options of a question."""

    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.CharField(max_length=127)

因此,如您所见,我有一个模型来保存问题(文本及其答案)。另外,我还有另一个模型可以保存与问题链接的一个选项。这样,我可以为问题的选项创建变量号,其中一个是正确的。但是我无法将正确的选项链接到模型Question,因为需要首先声明模型Question才能将每个Option链接到Question
有什么办法可以实现这一目标。

更新

经过一番思考,我弄清楚了可以使用的模型结构,还需要一个模型来回答。

class Question(models.Model):
    """Model for question."""
    ...


class Option(models.Model):
    """Model for options of a question."""
    ...

class Answer(models.Model):
    """Model for answers."""

    question = models.OneToOneField(Question, on_delete=models.CASCADE)
    answer = models.ForeignKey(Option, on_delete=models.PROTECT)

但是问题仍然在于,在定义模型之前(如果可能的话)如何引用模型。

1 个答案:

答案 0 :(得分:1)

这就是我重写代码示例的方式:

class Question(models.Model):
    """Model for question."""

    question_text = models.TextField(blank=True, null=True)
    answer = models.ForeignKey('Option', on_delete=models.PROTECT)  # Can't do this


class Option(models.Model):
    """Model for options of a question."""

    question = models.ForeignKey('Question', on_delete=models.CASCADE)
    text = models.CharField(max_length=127)

请注意传递给ForeignKey的第一个参数(粗体)。它是带有模型名称的字符串。

如果您查看foreignkey的官方Django文档,则会看到有关说明:

  

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

我个人认为这是一个好习惯,并且在所有模型类中始终使用它,而不考虑它们的定义顺序。好处是重构代码时不必考虑顺序。

此外,您可以引用其他应用程序中的模型:


class Foo(models.Model):
    bar = models.ForeignKey('baz.SomeModel', on_delete=models.DO_NOTHING)

无需显式导入模块,例如:

from baz.models import SomeModel