Django-mongoengine-不同应用程序的模型文件中的循环导入

时间:2019-03-15 03:37:12

标签: django django-models mongoengine circular-dependency

我有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。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

#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')