django优化合并查询集

时间:2013-03-07 13:41:02

标签: django django-queryset

例如,我有2个查询集:

q1=MyModel.objects.filter(visible=True)
q2=MyModel.objects.filter(published=True)

我需要创建单个查询集或列表,其中包含q1和q2中的所有对象。

我曾经这样做过:

q=list(chain(q1,q2))
#q= q1 | q2 #this gives me not all objects from q2 or q1,so i don't use bitwise or

但有人说,list()会对数据库产生额外的查询。这是真的吗?如果是,有人可以指定最优化的合并方式吗?

2 个答案:

答案 0 :(得分:1)

q1=MyModel.objects.filter(visible=True)
q2=MyModel.objects.filter(published=True)
qs12 = QuerySetSequence(qs1, qs2)

将上述代码与此代码段结合使用:http://djangosnippets.org/snippets/1933/

答案 1 :(得分:1)

您可以尝试这样做:

q1_pks = MyModel.objects.filter(visible=True).values_list('pk', flat=True)
q2_pks = MyModel.objects.filter(published=True).values_list('pk', flat=True)

final_query = MyModel.objects.filter(pk__in=list(q1_pks).extend(list(q2_pks)))

这应该可以解决问题,虽然我不确定那些list(qX_pks)是否会产生性能问题。

相关问题