簡體   English   中英

Django:在外鍵上區分,然后排序

[英]Django: distinct on a foreign key, then ordering

我有兩個模型,分別是TrackPair Pairtrack1track2popularity 我正在嘗試通過成對的流行程度(降序)獲得有序列表,沒有兩個對具有相同的track1 到目前為止,這是我嘗試過的方法:

lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')

這給了我以下錯誤:

ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

...所以我嘗試了這個:

lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('popularity', 'track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')

這給了我重復的track1__id的條目。 有誰知道解決這個問題的方法嗎? 我猜我將不得不使用raw()或類似的東西,但我不知道如何解決這樣的問題。 我將PostgreSQL用於數據庫后端,因此應支持DISTINCT

首先,讓我們澄清一下: DISTINCT是標准SQL,而DISTINCT ON是PostgreSQL擴展。

錯誤( DISTINCT ON expressions must match initial ORDER BY expressions )表明,您應該修復ORDER BY子句,而不是DISTINT ON (如果這樣做,您將得到不同的結果,就像您已經體驗過的那樣)。

DISTINCT ON表達式必須與最左邊的ORDER BY表達式匹配。 ORDER BY子句通常將包含其他表達式,這些表達式確定每個DISTINCT ON組中所需的行優先級。

這將為您帶來預期的結果:

lstPairs = Pair.objects.order_by('track1__id','-popularity').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')

在SQL中:

SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id, popularity DESC

但是可能順序錯誤。

如果您要原始訂單,可以在此處使用子查詢:

SELECT *
FROM (
  SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
  FROM pairs
  ORDER BY track1__id
  -- LIMIT here, if necessary
)
ORDER BY popularity DESC, track1__id

請參閱與眾不同文檔

第一:

僅在PostgreSQL上,您可以傳遞位置參數(* fields)以指定DISTINCT應該應用的字段名稱。

您不指定數據庫后端是什么,如果不是PostrgreSQL,則沒有機會使其正常工作。

第二:

指定字段名稱時,必須在QuerySet中提供order_by(),並且order_by()中的字段必須以相同的順序從distinct()中的字段開始。

我認為您應該使用raw(),或獲取按受歡迎程度排序的Pairs的整個列表,然后在Python中按track1唯一性進行過濾。

暫無
暫無

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

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