gpt4 book ai didi

python - MongoEngine:当将 document_type 定义为 str 时,ReferenceField 仅接受 DBRef 或文档

转载 作者:IT老高 更新时间:2023-10-28 13:30:11 25 4
gpt4 key购买 nike

在一个 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)

(即直接引用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'>

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com