Smu*_*dge 6 python mongodb mongoengine
在一个MongoEngine模型中,当我使用时,我正在使用参考字段
schedule = ReferenceField('Schedule',required=True)
Run Code Online (Sandbox Code Playgroud)
并尝试插入文档
#my_schedule being a 'Schedule' object that has been created and saved successfully
record.schedule = my_schedule
record.save()
Run Code Online (Sandbox Code Playgroud)
我明白了
ValidationError: ValidationError (Calling:None) (A ReferenceField only accepts DBRef or documents: ['schedule'])
Run Code Online (Sandbox Code Playgroud)
但是,如果我将字段定义更改为
schedule = ReferenceField(path.to.Schedule,required=True)
Run Code Online (Sandbox Code Playgroud)
(IE直接引用Schedule模型)
该文档可以成功保存.我怎样才能避免这个错误?
对计划模型的完全捍卫
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']
}
Run Code Online (Sandbox Code Playgroud)
并呼吁
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')]
}
Run Code Online (Sandbox Code Playgroud)
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'>}
Run Code Online (Sandbox Code Playgroud)
文件夹布局;
??? app
? ??? controllers
? ??? models
? ??? views
??? tasks
Run Code Online (Sandbox Code Playgroud)
app/models控制我的所有模型,这个特殊错误发生在tasks/update.py中(将数据文件导入Mongo,作为cron-job运行).当应用加载时,app /会附加到系统路径,如果这会产生影响.
在app/models中我每个模型都有一个文件,所以app/models/schedule.py包含Schedule等.
是的,你是正确的,因为我通过直接引用对象解决了问题,但这样做会在calling.py和schedule.py之间产生循环依赖问题,而我可以将Calling和Schedule模型移动到同一个文件中不想因为我是一个顽固的程序员而且喜欢我的单模型每个文件规则,尽管它没有真正的区别=)
添加
print type(my_schedule), schd, type(Schedule)
Run Code Online (Sandbox Code Playgroud)
给我
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>
Run Code Online (Sandbox Code Playgroud)
定义看起来不错,我有一种感觉,它的导入错误被验证错误消息掩盖了。
使用时,Calling您必须在代码中的某个位置导入Schedule,以便它当时存在于文档类存储库中。tasks/update.py 是否同时导入 Calling 和 Schedule 模型?