6

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

文档可以成功保存。我怎样才能避免这个错误?

完全定义 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'>
4

1 回答 1

1

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

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

于 2013-06-10T12:24:25.797 回答