我正在尝试查询EmbeddedDocumentFieldList字段中的某些内容,并且想在一定条件下使用或操作。 架构为自爆:
class EmbeddedDoc(EmbeddedDocument):
name = StringField()
class ParentDoc(Document):
name = StringField():
children = EmbeddedDocumentFieldList(EmbeddedDoc)
然后我想获取ParentDoc的名为“ a”或“ b”的子对象,我尝试使用Q函数,但是程序抛出了一个异常,说“过滤器方法采用了1个参数,但给了2个参数”。 还有其他方式吗? 谢谢
答案 0 :(得分:0)
我不知道您的“ Q”功能在做什么,但是我将向您展示如何查询嵌入式文档。 (编辑:我现在看到您在谈论“ Q”。添加到下面的答案中)
看你的模特〜
class EmbeddedDoc(EmbeddedDocument):
name = StringField()
def to_json(self):
return {
"name": self.name
}
class ParentDoc(Document):
name = StringField()
children = EmbeddedDocumentFieldList(EmbeddedDoc)
def to_json(self):
return {
"_id": str(self.pk),
"name": self.name,
"children": [child.to_json() for child in self.children]
}
我重写了to_json()方法,使其更易于阅读。该部分是可选的,但我建议使用。 我会用我的方法做这样的事〜
pdoc = ParentDoc.objects(pk=some_ID_variable)
if pdoc:
pdoc = pdoc.get(pk=some_ID_variable)
if pdoc.children.filter(name=some_name_variable):
child = pdoc.children.get(name=some_name_variable)
return child.to_json()
return {"message": "Child with that name not found"}
return {"message": "Parent with ID not found"}
这是怎么回事?首先,我查询以查看ParentDoc是否存在。如果存在,请从查询集中获取ParentDoc对象。由于嵌入对象没有主键,因此可以使用过滤器按名称查询对象的嵌入对象。如果存在,则以json格式返回嵌入的对象。
根据advanced queries部分的Mongoengine用户指南,要使用or运算符,我需要使用or按位运算符“ |”以及Q类。 所以我要添加这个〜
from mongoengine.queryset.visitor import Q
并将上面的过滤器更改为类似的内容〜
children = []
cdocs = pdoc.children.filter(Q(someParam=someValue) | Q(anotherParam=anotherValue))
children.append(cdoc.tojson() for cdoc in cdocs)
return {"Children": children}
我还没有使用过。希望对你有用!