【问题标题】:Django combine multiple querysets (same model)Django 组合多个查询集(相同模型)
【发布时间】:2018-04-24 12:03:30
【问题描述】:

我有查询集列表(全部用于同一模型):

results = Entry.objects.all()
result_elms = []
if city_list:
    for city in city_list:
    result_elms.append(results.filter(address__city__icontains=city))

if county_list:
    for county in county_list:
        results_elms.append(results.filter(address__county__icontains=county))
#other filters here, daynamically created

#how can I combine all results_elms (querysets) into one?

我知道我可以使用| 运算符来组合来自同一模型的查询集。 但是如何将它应用于result_elms 列表中的所有元素?

【问题讨论】:

  • 您的问题中没有足够的细节来给出答案。您应该为其他人提供足够的信息来重现问题,并清楚地描述您正在寻找的结果(也不需要 if 语句)。
  • 你用__in试过了吗?那应该对你有帮助。查看更多here
  • @thebjorn 你是什么意思?我的确切问题是如何申请 | (组合运算符)用于列表中的所有查询集。我还应该提供哪些其他信息?
  • 请指定您要应用的其他过滤器。预期结果如何?

标签: python django django-models


【解决方案1】:

你可以使用Q对象:

from django.db.models import Q

results = Entry.objects.all()
q = Q()
for city in city_list:
    q = q | Q(address__city__icontains=city)
results.filter(q)

文档 (https://docs.djangoproject.com/en/1.7/topics/db/queries/#complex-lookups-with-q) 包含更多详细信息和示例。

【讨论】:

  • 一点点额外信息清楚地表明了您的需求 - 很乐意提供帮助 :-)
  • 为什么是q = Q() 然后是q = q | Q(address__city__icontains=city)
  • @ammarx 因为q 需要一个初始值。如果有人写q |= Q(...)可能会更清楚?我想你可以用列表q = Q(address__city__icontains=citi_list[0]) 中的第一项初始化它,然后遍历city_list[1:]——但是你需要添加回 if 语句(而不是让 for 循环跳过空列表)。
  • 你可以使用results.filter(Q(address__city__icontains=city) | Q(another_filter))指定的here
  • @ammarx 我已经检查过了,您可以使用(在我的情况下):q = Entry.objects.empty() :)
【解决方案2】:

如果您至少使用 Django 1.11,这是一个单行。

final_results = result_elms[0].union(*result_elms[1:])

这里是documentaion 的链接。更多示例可以参考我的blog post

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2013-09-06
    • 2011-03-19
    • 1970-01-01
    • 2022-01-14
    • 2018-06-27
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多