Python 参照现有文档的参照字段

Python 参照现有文档的参照字段,python,mongodb,reference,document,mongoengine,Python,Mongodb,Reference,Document,Mongoengine,据我所知,允许传递对数据库中存储的另一个文档的引用 到目前为止,我能够在不同的集合中创建多个文档(在本例中减少为两个),现在需要相互引用 正如您将在下面看到的,我希望在“再生器”集合中创建新文档时传递给定材料的引用。在我提供的示例中,这意味着传递对文档的引用aisi304 我的再生器文档定义如下: class Regenerators(Document): material = ReferenceField(Materials, required=True) 物料文档需要引用到再生器文

据我所知,允许传递对数据库中存储的另一个文档的引用

到目前为止,我能够在不同的集合中创建多个文档(在本例中减少为两个),现在需要相互引用

正如您将在下面看到的,我希望在“再生器”集合中创建新文档时传递给定材料的引用。在我提供的示例中,这意味着传递对文档的引用
aisi304

我的再生器文档定义如下:

class Regenerators(Document):
    material = ReferenceField(Materials, required=True)
物料文档需要引用到再生器文档,其定义如下:

class Materials(Document):
    title = StringField(unique=True, required=True)
{
    "_id": ObjectId("565b89d355c40f6355fa5f45"),
    "material": {
        "_id": ObjectId("565b84dc55c40f63392ffdee"),
        "title": "aisi304"
    }
}
> db.regenerators.find()
{
        "_id" : ObjectId("565c9d110acf4510cf1f8712"),
        "material" : ObjectId("565c9cfc0acf4510cf1f8711")
}
> db.materials.find()
{ "_id" : ObjectId("565c9cfc0acf4510cf1f8711"), "title" : "aisi304" }
> 
但是,所需的物料文档已存储在数据库中,如本例所示:

{
    "_id": ObjectId("565b84dc55c40f63392ffdee"),
    "title": "aisi304"
}
因此,我尝试创建一个新的再生器文档,如下所示,将要引用的材料文档的标题作为关键字参数传递:

# the passed keywords are read from json normally, but I put it in directly for the sake of readability
r = Regenerators(material="aisi304")
r.save()
但是,由于数据库中存储的regernator文档如下所示(使用mongod进行调试),因此引用似乎没有正确传递:

我想我会达到这样的目标:

class Materials(Document):
    title = StringField(unique=True, required=True)
{
    "_id": ObjectId("565b89d355c40f6355fa5f45"),
    "material": {
        "_id": ObjectId("565b84dc55c40f63392ffdee"),
        "title": "aisi304"
    }
}
> db.regenerators.find()
{
        "_id" : ObjectId("565c9d110acf4510cf1f8712"),
        "material" : ObjectId("565c9cfc0acf4510cf1f8711")
}
> db.materials.find()
{ "_id" : ObjectId("565c9cfc0acf4510cf1f8711"), "title" : "aisi304" }
> 
在中,它们传递对新创建文档的引用。但是,这不适合我,因为我需要参考现有文件


我做错了什么?你做错了。您应该保存对
材质的引用
对象,然后将其作为参数传递给
再生器

m = Materials.objects.get(title='aisi304')
r = Regenerators(material=m).save()
演示

那么您的文档如下所示:

class Materials(Document):
    title = StringField(unique=True, required=True)
{
    "_id": ObjectId("565b89d355c40f6355fa5f45"),
    "material": {
        "_id": ObjectId("565b84dc55c40f63392ffdee"),
        "title": "aisi304"
    }
}
> db.regenerators.find()
{
        "_id" : ObjectId("565c9d110acf4510cf1f8712"),
        "material" : ObjectId("565c9cfc0acf4510cf1f8711")
}
> db.materials.find()
{ "_id" : ObjectId("565c9cfc0acf4510cf1f8711"), "title" : "aisi304" }
> 
如果要使用对现有文档的引用,则需要使用方法发出查询,然后将其引用作为参数传递给
再生器

m = Materials.objects.get(title='aisi304')
r = Regenerators(material=m).save()