在Django中QuerySet并行和减法的简单方法?

Jon*_*han 18 django django-queryset

考虑同一个类的两个QuerySet对象.有没有一种简单的方法可以通过计算联合将它们统一到一个QuerySet中?还有,有一种简单的方法可以减去它们吗?从其中一个集中删除两个集中出现的所有元素?

Jon*_*han 13

回到django的文档,你可以:

new_query_set = query_set_1 | query_set_2
Run Code Online (Sandbox Code Playgroud)

这作为一个逻辑OR,实际上是没有重复的添加.这回答了额外的方面,AFAIK 根本没有击中数据库!

new_query_set = query_set_1 & query_set_2
Run Code Online (Sandbox Code Playgroud)

这作为逻辑AND.

仍然缺少如何减去QuerySet.我很难相信社区没有优雅地处理这个问题......

  • 仍然在寻找减少查询集的方法 (2认同)

Dem*_*tes 13

使用相同的模型从另一个QuerySet中减去QuerySet.

这有效 - 但可能很慢

queryset_with_hello = Blog.objects.filter(name__icontains='hello')
queryset_without_hello = Blog.objects.exclude(pk__in=queryset_with_hello)
Run Code Online (Sandbox Code Playgroud)

阅读django文档中的性能注意事项:

https://docs.djangoproject.com/en/dev/ref/models/querysets/#in


Håk*_*Lid 12

由于Django的1.11,查询集有union(),intersection()而且difference()方法.

也可以在QuerySets中使用|&运算符(我在文档中找不到对此的引用,所以我猜union()并且intersection()是组合两个查询集的首选方法.

qs3 = qs1.union(qs2)         # or qs3 = qs1 | qs2
qs3 = qs1.intersection(qs2)  # or qs3 = qs1 & qs2
qs3 = qs1.difference(qs2)    # the ^ operator is not implemented.
Run Code Online (Sandbox Code Playgroud)

您还可以使用Q()对象,类似的查询集实施|&,和额外的反转操作~


Ber*_*ant 0

我认为对于这样的操作,你需要对其进行评估。因此,您可以调用list()它们并使用常见的 python 列表操作来处理它们!