首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoEngine: ReferenceField在将document_type定义为str时只接受DBRef或文档

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

Stack Overflow用户
提问于 2013-06-09 23:40:14
回答 1查看 5.1K关注 0票数 6

在一个MongoEngine模型中,我使用一个引用字段,当我使用

代码语言:javascript
复制
schedule =  ReferenceField('Schedule',required=True)

并尝试插入文档。

代码语言:javascript
复制
#my_schedule being a 'Schedule' object that has been created and saved successfully
record.schedule = my_schedule
record.save()

我得到了

代码语言:javascript
复制
ValidationError: ValidationError (Calling:None) (A ReferenceField only accepts DBRef or documents: ['schedule'])

但是,如果我将字段定义更改为

代码语言:javascript
复制
schedule =  ReferenceField(path.to.Schedule,required=True)

(即直接参考附表模式)

可以成功地保存文档。如何避免此错误?

进度表模型的全防御

代码语言:javascript
复制
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']
    }

给我打电话

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
{'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'>}

文件夹布局;

代码语言:javascript
复制
├── app
│   ├── controllers
│   ├── models
│   └── views
└── tasks

app/model控制着我的所有模型,这个特殊的错误发生在任务/update.py(将一个数据文件导入Mongo,作为一个cron作业运行)。当应用程序加载时,app/被附加到系统路径中,如果这有区别的话。

在app/ model中,每个模型都有一个文件,所以app/model/schedule.py包含时间表等等。

是的,您是正确的,因为我通过直接引用对象解决了这个问题,但是这样做会在calling.py和schedule.py之间造成一个循环依赖问题,而我可以将调用和调度模型移到我不想要的文件中,因为我是一个顽固的程序员,喜欢我的一个模型-每个文件规则,尽管它并没有真正的区别=)

更新2

添加

代码语言:javascript
复制
print type(my_schedule), schd, type(Schedule)

给我

代码语言:javascript
复制
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>
EN

回答 1

Stack Overflow用户

发布于 2013-06-10 12:24:25

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

在使用Calling时,在代码中的某个地方导入了Schedule,因此它当时存在于文档类存储库中。任务/update.py是否同时导入调用和调度模型?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17015251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档