我已经在我的(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中。
答案 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使用ReferenceField
或DBRef
存储ObjectID
。如果字段配置为'stuff'
,则DBRef
的{{1}}参数将被忽略。否则,这必须是dbref=False
对象的集合名称。
但是,由于在Stuff
中实现验证的方式,在两种情况下都需要将DBRef
个对象传递给构造函数。