因此,在这种情况下,我需要在定义模型之前为模型创建外键。考虑以下模型:
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)
但是问题仍然在于,在定义模型之前(如果可能的话)如何引用模型。
答案 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