在一个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')]
    }
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控制着我所有的模型,这个特殊的错误发生在task/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'>

最佳答案

定义看起来不错,我感觉其导入错误被验证错误消息掩盖了。

使用Calling时,您的具有以便将Schedule导入代码中的某个位置,从而使其当时存在于文档类存储库中。 task/update.py是否同时导入调用模型和计划模型?

关于python - MongoEngine:当将document_type定义为str时,ReferenceField仅接受DBRef或文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17015251/

10-13 06:18