在一个MongoEngine模型中,当我使用
时,我正在使用参考字段schedule = ReferenceField('Schedule',required=True)
并尝试插入文档
#my_schedule being a 'Schedule' object that has been created and saved successfully
record.schedule = my_schedule
record.save()
我得到了
ValidationError: ValidationError (Calling:None) (A ReferenceField only accepts DBRef or documents: ['schedule'])
但是,如果我将字段定义更改为
schedule = ReferenceField(path.to.Schedule,required=True)
(I.E。直接参考附表模型)
可以成功保存文档。如何避免此错误?
完全保留计划模型
class Schedule(Document):
uid = StringField(required=True)
start = DateTimeField(required=True)
end = DateTimeField(required=True)
days = ListField(required=True)
toc = StringField(required=False)
meta = {
'indexes':['uid']
}
呼叫
class Calling(Document):
"""
Calling Point
"""
schedule = ReferenceField('Schedule',required=True)
tiploc = StringField(required=True)
calling = ListField(StringField(required=True))
arrive = IntField(required=False)
depart = IntField(required=False)
meta = {
'indexes':[('schedule','calling','tiploc','depart'),('schedule','tiploc')]
}
Python 2.7,MongoEngine 0.8.2,PyMongo 2.5.2
根据要求;输出_document_registry
{'Calling': <class 'models.calling.Calling'>,
'Schedule': <class 'models.schedule.Schedule'>,
'Station': <class 'models.station.Station'>,
'Stop': <class 'models.stop.Stop'>,
'Train': <class 'models.train.Train'>,
'Update': <class 'models.update.Update'>}
文件夹布局;
├── app
│ ├── controllers
│ ├── models
│ └── views
└── tasks
app / models控制我的所有模型,这个特殊错误发生在tasks / update.py中(将数据文件导入Mongo,作为cron-job运行)。应用程序/在应用程序加载时附加到系统路径,如果这会产生影响。
是的,你是正确的,因为我通过直接引用对象解决了问题,但这样做会在calling.py和schedule.py之间产生循环依赖问题,而我可以将Calling和Schedule模型移动到同一个文件我不想,因为我是一个顽固的程序员,喜欢我的每个模型的文件规则,尽管它没有真正的区别=)
添加
print type(my_schedule), schd, type(Schedule)
给了我
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>
答案 0 :(得分:1)
定义看起来很好,我感觉它的导入错误被验证错误消息掩盖了。
使用Calling
时 在代码中的某处导入Schedule
,以便它当时存在于文档类资源库中。 tasks / update.py是否同时导入Calling和Schedule模型?