簡體   English   中英

如何在Django中合並兩個查詢並選擇與兩個不相關的表不同

[英]How do I merge two queries in django and select distinct from two unrelated tables

我正在使用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的信息。 由於每個表中的列都有不同的標題,除了值(而不是鍵)外沒有其他屬性,如何合並它們,排序和選擇不同的組合? 還是應該重命名列以刪除表引用?

您可以使用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但是似乎沒有一種在查詢集中創建別名的簡單方法。 此票證表明將來可能會發生變化。 最后的注釋描述了帶有F表達式和annotate的替代方法,該方法應與django v1.8一起使用

我已經解決了它,但是我不確定這是最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 %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM