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