考虑同一个类的两个QuerySet对象。 有没有一种简单的方法可以通过计算联合将它们统一到一个QuerySet中? 还有,有一种简单的方法可以减去它们吗?从其中一个集中删除两个集中出现的所有元素?
答案 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列表操作来处理它们!