【问题标题】:Django : Joining two tables and using extra field from second table for order_byDjango:连接两个表并使用第二个表中的额外字段作为 order_by
【发布时间】:2016-08-12 18:10:08
【问题描述】:

我有两个模型 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 值排序的

因此需要将'value'字段转换为Integer然后需要对其进行排序。

我也尝试过以下一种,但报错

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]

建议或帮助将不胜感激。

【问题讨论】:

  • 你的 django 模型中的 b_value 是什么?小数域?
  • 我认为使用extra() 是正确的方法。错误是什么?
  • b 是模型名称,值是字段名称。所以 b__value 是用 order_by 写的。
  • @C14L ,我无法打印/使用 xyz ,如果我尝试打印 xyz ,则会出现类似 django.db.utils.OperationalError: (1054, "Unknown column 'b__value'在“字段列表”中”)
  • 好吧...你的模型中的value是什么?十进制字段?

标签: python mysql django


【解决方案1】:

.extra()方法的select采用SQL,所以列名应该写成SQLb.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]

【讨论】:

    【解决方案2】:

    既然我很确定这是我要写的问题...

    我猜value 是一个DecimalField,它在内部存储为用于索引的字符串,这就是您看到奇怪排序的原因。

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

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 2021-08-23
      • 2015-08-11
      • 2021-09-30
      • 2021-10-29
      • 1970-01-01
      • 2012-10-17
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多