1

我已经在我的(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 使用那些现有的 Stuffs 作为新 StuffsCollection 中的关键字参数吗?这似乎比为每个文档查询数据库,然后创建该文档的新实例,然后将每个实例传递到我的新 ListField 更有效。

4

1 回答 1

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()

MongoEngineReferenceField使用DBRef或存储 a ObjectID。如果该字段配置了 ,则'stuff'参数 toDBRef将被忽略dbref=False。否则,这必须是Stuff对象集合的名称。

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

于 2013-12-26T21:32:06.577 回答