Django Array包含一个字段



我使用的是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,其中提供了更深入的解释和示例。理解这些行为有助于提高应用程序的效率。

相关内容

  • 没有找到相关文章

最新更新