3

Django 文档条目中ForeignKey,它说:

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

例如名称

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

或对象

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

这两种变体有什么区别?

4

2 回答 2

3

您的第二个示例直接引用了类本身,并要求在使用之前定义或导入该类,而第一个示例将使用 Django 的模型加载框架

通常,直接引用类就可以了。在不优选或不可能的情况下(例如,如果您稍后在同一文件中定义制造商,或者如果导入类会导致循环导入问题),字符串语法将使您能够合理地设置关系。

于 2013-08-30T20:09:39.227 回答
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),它在命名空间中找不到名称Manufacturer,并且会导致错误。

为了解决这个问题,通常您更改定义的顺序:

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

于 2013-08-30T20:08:33.343 回答