【问题标题】:django optimize merging querysetsdjango 优化合并查询集
【发布时间】:2013-02-22 17:48:10
【问题描述】:

例如,我有 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() 将对数据库产生额外的查询。这是真的吗?如果是,有人可以指定最优化的合并方式吗?

【问题讨论】:

  • 在发布 cmets 之前,请仔细阅读我的要求。
  • 好吧,然后q = MyModel.objects.filter(Q(visible=True) | Q(published=True))。这将是两个查询集的联合。 list() 不会产生额外的查询,但会强制直接评估查询集,这将导致额外的内存开销。
  • 感谢 list() 的解释,但您也可以阅读 p.s.我的问题的一部分。

标签: django django-queryset


【解决方案1】:
q1=MyModel.objects.filter(visible=True)
q2=MyModel.objects.filter(published=True)
qs12 = QuerySetSequence(qs1, qs2)

将上面的代码与这个sn-p结合起来:http://djangosnippets.org/snippets/1933/

【讨论】:

    【解决方案2】:

    您可以尝试这样做:

    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) 是否会产生性能问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多