【问题标题】:django "__contains" and "__in" as a single query [duplicate]django“__contains”和“__in”作为单个查询[重复]
【发布时间】:2015-05-24 19:28:10
【问题描述】:

我在 Django 中有一个相当奇怪的问题,我看不到如何将“__contains”和“__in”组合在一个语句中。

所以,这是我的情况:我有一个这样的条目列表:

a = ["hgfjhgj89789jkbjk", "jhgjkhj89789jkhkjh", "jhgkjhkj89689gfghdfhg"]

我想对照一个查询集检查这个列表——我通常会这样做:

queryset = MyModel.objects.all().filter(my_field__in=a)

但是,在我的情况下,my_fielda 中的值不完全匹配,因此,我不得不求助于 __contains,如下所示:

queryset = MyModel.objects.all().filter(my_field__contains=a[0])

..但是,我的 a 现在有 2000 个条目,我无法运行上述查询 2000 次 - 听起来很傻。

那么,我怎样才能将这个“__contains”与“__in”结合起来呢? 对不起,如果这是一个愚蠢的问题!

【问题讨论】:

  • 这与本案无关!
  • 这个问题很遗憾地被错误命名(已修复),但它是完全相同的问题,答案完全相同。

标签: python django


【解决方案1】:

这不能用一个过滤器来完成,但可以使用 Django 的 Q 对象来完成:

from django.db.models import Q

query = Q()
for entry in a:
    query = query | Q(my_field__contains=entry)

queryset = MyModel.objects.filter(query)

Q objects 让您一次完成复杂的查询 - 查看文档以获取更多示例。

【讨论】:

  • 这是否保留了a 中值的顺序?
  • 我不确定你的意思。生成的查询集将按照数据库输出的任何顺序进行排序。
  • 问题似乎是 a 的顺序没有保留在结果查询集中 - 如果你知道我的意思.. 所以如果 a=[1,2,3] 查询集以不同的方式吐出结果order...有什么方法可以在结果查询集中保留a 的这个顺序?
  • 在数据库级别,只能按字段排序。因此,您可以按 my_field 对结果进行排序 - 但您不能让所有匹配 a[0] 的结果先出现,然后是匹配 a[1] 的那些,等等。之后您必须在 Python 中执行此操作。
  • 好的 Ben - 明白 :) 接受你的回答!非常感谢!
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 2015-12-30
  • 2018-10-31
  • 2021-07-08
  • 2018-10-20
相关资源
最近更新 更多