django在保存之前模拟与两个模型的关系

时间:2015-09-15 11:02:22

标签: python django django-models

我有两个应用程序说app1和app2,我有模型。

from app2.models import SecondModel
class FirstModel(models.Model):
    first_field = models.ManyToManyField(SecondModel, blank=True)# or Foreign Key

from app1.models import FirstModel
class SecondModel(models.Model):
    second_field = models.ForeignKey(FirstModel)

当我这样做时,我得到导入错误。

无法导入名称'FirstModel'

为什么会这样?

2 个答案:

答案 0 :(得分:1)

错误是因为您有循环导入。两个模块都无法相互导入。

在这种情况下,您无需将模型导入每个应用程序。删除导入,改为使用字符串app_label.ModelName

# app1.models.py
class FirstModel(models.Model):
    first_field = models.ManyToManyField('app2.SecondModel')

# app2.models.py
class SecondModel(models.Model):
    second_field = models.ForeignKey('app1.FirstModel')

答案 1 :(得分:1)

此处存在名称冲突..您在models.py中定义了FirstModel,然后在上面的代码中定义了FirstModel,这可能是可能出现的问题。此外,导入错误通常意味着,没有从导入位置定义FirstModel。

然而,一种更通用的方法是在没有导入的情况下进行FK通常是

class FkModel(models.Model):
    relationship = models.ManyToManyField('appName.modelName')

其中appName是您尝试从中导入模型的应用程序,而modelName是您尝试创建关系的模型。这有助于你尝试做这样的事情。

让我们说你的应用名称是' app'并且您正在尝试创建从第一个模型到第二个模型的多对多关系,例如,在第一个模型之后声明该类,例如。

class Model1(models.Model):
    first_field = models.ManyToManyField('app.Model1')

class Model2(models.Model):
    name = models.CharField(maxlength=256)

只是将你的appname.modelName放在字符串中:)

另外,您的ManyToManyField()声明中存在缺陷,即您不需要在多对多中定义空白。 db的工作方式是,他们创建了一个第三个数据库表,只是为了存储多对多的关系。

希望有所帮助

//鼠标。