使用模型名称和ForeignKey模型之间的区别

时间:2013-08-30 20:03:30

标签: python django

ForeignKey的{​​{3}}条目中,它说:

  

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

e.g。名称

class Car(models.Model):
    manufacturer = models.ForeignKey('Manufacturer')

或对象

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)

这两种变体有什么区别?

2 个答案:

答案 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不会引发错误。