我使用的是Django,使用的是mongoengine。我有一个带有铭文列表的模型类,并且我想获得在该列表中具有id的文档。
classes = Classes.objects.filter(inscriptions__contains=request.data['inscription'])
下面是查询ArrayField成员关系的一般解释:
根据Django的ArrayField文档,__contains
操作符检查提供的数组是否是ArrayField中值的子集。
那么,为了过滤ArrayField是否包含值"foo",你传入一个长度为1的数组,包含你正在寻找的值,像这样:
# matches rows where myarrayfield is something like ['foo','bar']
Customer.objects.filter(myarrayfield__contains=['foo'])
Django ORM生成@>
postgres操作符,你可以通过打印查询看到:
print Customer.objects.filter(myarrayfield__contains=['foo']).only('pk').query
>>> SELECT "website_customer"."id" FROM "website_customer" WHERE "website_customer"."myarrayfield_" @> ['foo']::varchar(100)[]
如果您提供数组以外的东西,您将得到一个类似DataError: malformed array literal: "foo" DETAIL: Array value must start with "{" or dimension information.
也许我错过了什么…但似乎你应该使用.filter()
:
classes = Classes.objects.filter(inscriptions__contains=request.data['inscription'])
这个答案是参考你对新答案的评论
在Django ORM中,当你使用ORM调用数据库时,它通常会返回一个QuerySet或一个模型对象,如果你使用get()/number,如果你使用count()等。,这取决于您正在使用的函数返回的不是查询集。
Queryset函数的结果可用于实现进一步的细化,例如,如果您想执行order()或仅收集distinct()等。Queryset是惰性的,这意味着它只在实际使用时才访问数据库,而不是在分配时访问数据库。你可以在这里找到更多关于他们的信息。
不返回queryset的函数不能实现这样的事情。
请花时间阅读Queryset Documentation,其中提供了更深入的解释和示例。理解这些行为有助于提高应用程序的效率。