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

时间:2010-06-04 13:32:46

标签: django django-queryset

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

4 个答案:

答案 0 :(得分:13)

回到django's documentation,你可以:

new_query_set = query_set_1 | query_set_2

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

new_query_set = query_set_1 & query_set_2

这是一个逻辑AND。

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

答案 1 :(得分:13)

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

这有效 - 但可能很慢

queryset_with_hello = Blog.objects.filter(name__icontains='hello')
queryset_without_hello = Blog.objects.exclude(pk__in=queryset_with_hello)

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

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

答案 2 :(得分:3)

您可以使用Q object

语法可能是这样的:

added_query_set = YourModel.objects.\
         filter(Q(id__in=old_query_set_1)|Q(id__in=old_query_set_2))

你可能可以根据你的实际需要进行优化并获得db命中量(现在是3),但这应该可以让你开始。

答案 3 :(得分:0)

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