【问题标题】:Difference between using name of model and model for ForeignKeyForeignKey 使用模型名称和模型名称的区别
【发布时间】:2013-08-30 20:03:29
【问题描述】:

ForeignKeyDjango docs 条目中,它说:

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

例如名字

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

或对象

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

这两种变体有什么区别?

【问题讨论】:

    标签: python django


    【解决方案1】:

    您的第二个示例直接引用了类本身,并要求在使用之前定义或导入该类,而第一个示例将使用 Django 的model loading framework

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

    【讨论】:

      【解决方案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 类之前声明)。另一种方法是这样做;如果您不想打乱模型声明的顺序,请使用 string,它是您要引用的模型的名称。由于它是字符串而不是名称,Python 不会引发错误。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 2021-08-11
        • 2011-10-07
        • 2013-11-06
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        相关资源
        最近更新 更多