Django:加入两个表并使用第二个表中的额外字段来获取order_by

时间:2016-04-20 08:01:39

标签: python mysql django

我有两个型号A,B

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以​​转换为Integer,然后排序。

我需要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]

建议或帮助将不胜感激。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

因为我很确定这是我要写的问题......

我猜测valueDecimalField,它在内部存储为索引字符串,这就是你看到奇怪排序的原因。

解决方案是将值的类型从DecimalField更改为FloatField