MongoEngine:在将document_type定义为str时,ReferenceField只接受DBRef或文档

时间:2013-06-09 23:40:15

标签: python mongodb mongoengine

在一个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运行)。应用程序/在应用程序加载时附加到系统路径,如果这会产生影响。

app / models我每个模型都有一个文件,所以app / models / schedule.py包含Schedule等。

是的,你是正确的,因为我通过直接引用对象解决了问题,但这样做会在calling.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'>

1 个答案:

答案 0 :(得分:1)

定义看起来很好,我感觉它的导入错误被验证错误消息掩盖了。

使用Calling 在代码中的某处导入Schedule,以便它当时存在于文档类资源库中。 tasks / update.py是否同时导入Calling和Schedule模型?