2016-04-20 12 views
3

我有兩個型號A,BDjango的:連接兩個表,並使用額外的字段從第二個表ORDER_BY

MySQL查詢是

SELECT a.ID FROM a INNER JOIN b ON (a.ID = b.id) WHERE (b.key = 'vcount') AND (a.type = 'abc') AND (a.status = 'done') ORDER BY b.value+0 DESC LIMIT 0, 5 

//這裏b.value是LONGTEXT場,所以加0轉換爲整數,然後排序。

我需要Django的查詢相同。

我已經試過這

A.objects.filter(b__key ="vcount",type = "abc",status = "done").order_by('-b__value')[:5] 

但上述Django的查詢是給錯誤的結果,因爲它是由ASCII值排序

所以需要轉換「值」字段爲整數,然後需要對它進行排序。

我也嘗試下面的一個,但給錯誤

xyz = A.objects.filter(b__key ="vcount",type = "abc",status = "done").extra(select={'value_int': "CAST(b__value AS UNSIGNED)"}).order_by('-value_int')[:5] 

建議或幫助將不勝感激。

+0

什麼是'b_value'在你的Django模型? DecimalField? – Sayse

+0

我認爲使用'extra()'是正確的方法。什麼是錯誤? – C14L

+0

b是型號名稱,值是字段名稱。所以b__value被寫入order_by。 – Chandu

回答

0

.extra()方法的select取SQL,所以列名應該寫成SQL b.value

xyz = A.objects.filter(b__key ="vcount",type = "abc",status = "done") 
     .extra(select={'value_int': "CAST(b.value AS UNSIGNED)"}) 
     .order_by('-value_int')[:5] 
0

既然我敢肯定這是我要去反正寫的問題...

我猜value是內部存儲爲索引的字符串DecimalField ,這就是爲什麼你看到奇怪的順序。

的解決方案是從DecimalField值的類型更改爲FloatField

相關問題