【问题标题】:Django - mongoengine - Circular imports in models files of different appsDjango - mongoengine - 不同应用程序的模型文件中的循环导入
【发布时间】:2019-03-15 03:37:11
【问题描述】:

我有 2 个应用程序、用户和盒子。他们的模型包含 2 个类,每个类都没有循环依赖,但模型文件有循环依赖。

他们的型号如下

#users/models.py

from mongoengine import fields, Document
from boxes.models import *

class Token(Document):
    id = fields.IntField(primary_key=True)
    key = fields.StringField(required=True)
    box = fields.ReferenceField(Box)

class User(Document):
    id = fields.IntField(primary_key=True)
    name = fields.StringField(required=True)


#boxes/models.py

from mongoengine import fields, Document
from users.models import *

class Box(Document):
    id = fields.IntField(primary_key=True)
    name = fields.StringField(required=True)


class Testing(Document):
    id = fields.IntField(primary_key=True)
    field1 = fields.StringField(required=True)
    field_ref = fields.ReferenceField(User)

在启动服务器期间,我在测试类中遇到错误

NameError: name 'User' is not defined

我尝试过的事情:

#Trial 1
from django.apps import apps

field_ref = fields.ReferenceField(apps.get_model('users', 'User'))
#error
django.core.exceptions.AppRegistryNotReady: Models are not loaded yet.


#Trial 2
field_ref = fields.ReferenceField('User')
OR
field_ref = fields.ReferenceField('users.User')
#Error
mongoengine.errors.ValidationError: ValidationError (Box:5b8ddef7a095d8586d2263bb) (A ReferenceField only accepts DBRef or documents: ['user'])

我也尝试了其他帖子中给出的解决方案,但都不起作用。

我正在使用 Django =1.9。任何帮助将不胜感激。

【问题讨论】:

  • 在用户/模型中从 box.models import * 更改为 from boxes.models import Box
  • @Trent,我试过了,同样的错误

标签: django django-models mongoengine circular-dependency


【解决方案1】:

老问题,但可能对其他人有帮助。您的主要问题应该在以下几行:

#users/models.py
from boxes.models import *
...
#boxes/models.py
from users.models import *

您正在尝试将每个模型导入其他模型。试着像解释器一样阅读这篇文章。那是一个循环。 不要一个一个地导入模型。因为如果你这样做,迟早你会得到循环导入。而不是这样做:

#models/__init__.py

# Use explicit imports, not *
from boxes.models import Box, Testing
from users.models import Token, User

#users/models.py

from mongoengine import fields, Document
# from boxes.models import * <-- remove this line

class Token(Document):
    ...
    box = fields.ReferenceField('Box')  # model name in quotes

class User(Document):
    ...

#boxes/models.py

from mongoengine import fields, Document
# from users.models import * <-- remove this line

class Box(Document):
    ...


class Testing(Document):
    ...
    field_ref = fields.ReferenceField('User')  # model name in quotes 

我说“不要将模型导入另一个”。我是认真的。如果您想在当前模型方法中使用另一个模型,请不要导入模型。试试这个:

from mongoengine.base import get_document as get_model
...
User = get_model('User')

实际上,当您编写这样的代码时,这是用于获取模型的函数:fields.ReferenceField('User')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2020-07-11
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多