在一个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)(即直接参考附表模式)
可以成功地保存文档。如何避免此错误?
进度表模型的全防御
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')]
}Python2.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
└── tasksapp/model控制着我的所有模型,这个特殊的错误发生在任务/update.py(将一个数据文件导入Mongo,作为一个cron作业运行)。当应用程序加载时,app/被附加到系统路径中,如果这有区别的话。
在app/ model中,每个模型都有一个文件,所以app/model/schedule.py包含时间表等等。
是的,您是正确的,因为我通过直接引用对象解决了这个问题,但是这样做会在calling.py和schedule.py之间造成一个循环依赖问题,而我可以将调用和调度模型移到我不想要的文件中,因为我是一个顽固的程序员,喜欢我的一个模型-每个文件规则,尽管它并没有真正的区别=)
更新2
添加
print type(my_schedule), schd, type(Schedule)给我
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>发布于 2013-06-10 12:24:25
定义看起来很好,我感觉这是一个被验证错误消息掩盖的导入错误。
在使用Calling时,有在代码中的某个地方导入了Schedule,因此它当时存在于文档类存储库中。任务/update.py是否同时导入调用和调度模型?
https://stackoverflow.com/questions/17015251
复制相似问题