在一个 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)
(IE直接引用Schedule模型)
文档可以成功保存。我怎样才能避免这个错误?
完全定义 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']
}
和打电话
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 运行)。app/ 会在应用程序加载时附加到系统路径,如果这有影响的话。
在 app/models 中,每个模型都有一个文件,因此 app/models/schedule.py 包含 Schedule 等。
是的,你是对的,我通过直接引用对象解决了这个问题,但是这样做会在 call.py 和 schedule.py 之间产生循环依赖问题,而我可以将 Calling 和 Schedule 模型移动到我不这样做的同一个文件中'不想,因为我是一个固执的程序员,喜欢我的每个文件一个模型的规则,尽管它没有真正的区别 =)
更新 2
添加
print type(my_schedule), schd, type(Schedule)
给我
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>