【问题标题】:How do I merge two queries in django and select distinct from two unrelated tables如何在 django 中合并两个查询并从两个不相关的表中选择不同的
【发布时间】:2015-06-27 01:02:13
【问题描述】:

我正在使用带有 MySQL 后端的 Django (1.8)。我有两个要查询的不相关表。结果是每个表中两列的串联。我想合并结果,对它们进行排序并选择不同的。为了举例,假设我有 tableA 和 tableB 两者都有 first_name 和 last_name 列。每个 cloumn 标题都有对其中表的引用(例如 first_name_A)。目前我正在对每个表运行查询并使用 sorted(chain(queryA, queryB)) 将它们放在一起。当我尝试在模板中的 for 循环中引用结果时,问题就来了。

在代码方面我有这个:

views.py

queryA = tableA.objects.order_by('first_name_A', 'last_name_A').values('first_name_A', 'last_name_A').distinct()
queryB = tableB.objects.order_by('first_name_B', 'last_name_B').values('first_name_B', 'last_name_B').distinct()

query = sorted(chain(queryA, queryB))

return render_to_response('results.html', {'queries': query})

html

<div>
{% for query in queries %}
    <tr>
        <td>{{ query.first_name_A }} {{ query.last_name_A }}</td>
    </tr>
{% endfor %}
</div>

上面的 html 显然只会返回 tableA 中的名字和姓氏。这些已排序且不同,但不包括来自 tableB 的信息。由于每个表中的列具有不同的标题并且除了值(而不是键)之外没有类似的属性,我如何合并它们、排序和选择不同的组合?还是应该只重命名列以删除表引用?

【问题讨论】:

    标签: mysql django django-queryset


    【解决方案1】:

    您可以使用extra() 修饰符来指定替代名称。

    queryA = tableA.extra(select={'alias' : 'first_name_A'}).order_by('first_name_A').values('alias').distinct()
    queryB = tableB.extra(select={'alias' : 'first_name_B'}).order_by('first_name_B').values('alias').distinct()
    

    django 文档不鼓励使用extra,但似乎没有一种简单的方法可以在查询集中创建别名。 This ticket 建议将来可能会改变。最后一条评论描述了一种使用 F 表达式和 annotate 的替代方法,它应该适用于 django v1.8

    【讨论】:

    • 谢谢@zxzak 我会研究一下 extra() 修饰符。
    • 看起来 django 文档不赞成使用 extra 并且将被弃用。
    【解决方案2】:

    我已经解决了,但我不确定这是最 Pythonic(也不正确)的方法。如果有人有更好的建议,请告诉我。

    views.py

            queryA = tableA.objects.order_by('first_name_A','last_name_A').values('first_name_A', 'last_name_A').distinct()
            queryB = tableB.objects.order_by('first_name_B','last_name_B').values('first_name_B', 'last_name_B').distinct()
    
    
            chain_query = sorted(chain(queryA, queryB))
    
    
            valueList = []
    
    
            for q in chain_query:
                wholeName = ' '.join(q.values())
                valueList.append(wholeName)
    
    
            query = sorted(set(valueList))  
    
            return render_to_response('results.html', {'queries': query})
    

    html

        {% for query in queries %}
        <tr>
            <td>{{ query }}</td>
        </tr>
        {% endfor %}
    

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 2010-10-17
      • 2012-07-20
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多