ある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 モデルを直接参照します)
ドキュメントは正常に保存できます。このエラーを回避するにはどうすればよいですか?
スケジュール モデルの完全な定義
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 ジョブとして実行します)。app/ は、アプリの読み込み時にシステム パスに追加されます (それが違いを生む場合)。
app/models には、モデルごとに 1 つのファイルがあるため、app/models/schedule.py には Schedule などが含まれます。
はい、オブジェクトを直接参照することで問題を解決したという点では正しいですが、それを行うと、calling.py と schedule.py の間に循環依存の問題が発生しますが、Calling モデルと Schedule モデルを同じファイルに移動できます。私は頑固なプログラマーであり、実際の違いはないにもかかわらず、ファイルごとに1つのモデルのルールが好きなので、したくありません=)
更新 2
追加する
print type(my_schedule), schd, type(Schedule)
私にくれます
<class 'app.models.schedule.Schedule'> Schedule object <class 'mongoengine.base.metaclasses.TopLevelDocumentMetaclass'>