在ForeignKey
的{{3}}条目中,它说:
如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身:
e.g。名称
class Car(models.Model):
manufacturer = models.ForeignKey('Manufacturer')
或对象
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer)
这两种变体有什么区别?
答案 0 :(得分:3)
你的第二个例子直接引用了类本身,并要求在使用它之前定义或导入类,而第一个示例将使用Django的model loading framework。
通常,直接引用该类就可以了。在不优选或不可能的情况下(例如,如果您稍后在同一文件中定义制造商,或者导入类会导致循环导入问题),字符串语法将允许您合理地设置关系。 / p>
答案 1 :(得分:2)
如果在models.py
中你有这个:
class Car(models.Model):
name = models.CharField(max_length=200)
manufacturer = models.ForeignKey(Manufacturer)
class Manufacturer(models.Model):
name = models.CharField(max_length=200)
由于课程Manufacturer
是在 Car
之后定义的,当解释器到达此行:models.ForeignKey(Manufacturer)
时,它找不到名称制造商< / em>在命名空间中,它将导致错误。
要解决此问题,通常需要更改定义的顺序:
class Manufacturer(models.Model):
name = models.CharField(max_length=200)
class Car(models.Model):
name = models.CharField(max_length=200)
manufacturer = models.ForeignKey(Manufacturer)
现在,当解释器到达制造商外键定义时,该类已经被定义(因为它在Car
类之前声明)。另一种方法;如果您不希望改变声明模型的顺序是使用字符串,它是您要引用的模型的名称。由于它是一个字符串而不是一个名字,因此Python不会引发错误。