如何使用数据库中已有的引用文档创建MongoEngine文档?

时间:2013-12-26 20:30:54

标签: flask mongoengine flask-mongoengine

我已经在我的(Flask-MongoEngine)数据库中存储了一类文档,我已经拥有了他们唯一的ID 。我的实际例子比较复杂,但让我们说它看起来像这样:

class Stuff(Document):
    stuffstuff = StringField()

我想在我的数据库中创建一个Stuffs的Stuff实例集合。假设我想从当前数据库中的Stuff实例创建下面的类的新实例。

class StuffsCollection(Document):
    lotsofstuffs = ListField(ReferenceField(Stuff))

ReferenceField文档中,看起来创建StuffsCollection实例的唯一方法是首先创建Stuff实例,然后将它们作为关键字参数传递。例如:

a_thing = Stuff(stuffstuff="here's a thing")
a_thing.save()
some_things = StuffsCollection(lotsofstuffs=[a_thing])
some_things.save()

由于我已经拥有引用我的Stuff实例的唯一ID,我可以告诉MongoEngine在新的StuffsCollection中使用那些现有的Stuff作为关键字参数吗?看起来这比使用它更有效查询每个文档的数据库,然后创建该文档的新实例,然后将每个文档传递到我的新ListField中。

1 个答案:

答案 0 :(得分:2)

您需要传递DBRef个对象:

from bson import DBRef, ObjectId

a_id = ObjectId('somevalidid')
a_ref = DBRef('stuff', a_id)

some_things = StuffsCollection(lotsofstuffs=[a_ref])
some_things.save()

MongoEngine使用ReferenceFieldDBRef存储ObjectID。如果字段配置为'stuff',则DBRef的{​​{1}}参数将被忽略。否则,这必须是dbref=False对象的集合名称。

但是,由于在Stuff中实现验证的方式,在两种情况下都需要将DBRef个对象传递给构造函数。