在注释中组合F和Count时,Django“有条款中的未知列”

时间:2016-05-10 11:13:27

标签: python mysql django django-queryset django-orm

使用Count,F对象和整数

进行批注时,我遇到了一个问题
else
  

操作错误:(1054,“有子句”中的“未知列'bug_example_task.my_integer'”)

令人惊讶的是,如果我更改以下顺序,它会起作用:

class Task(models.Model):
    my_integer = models.IntegerField()

class User(models.Model):
    task = models.ForeignKey("Task", related_name="users")


Task.objects.annotate(
    sum= 1 + F('my_integer') + Count('users')
).filter(
    sum= 10
).count()

为:

1 + F('my_integer') + Count('users')

但不幸的是我被锁定了(我给出了一个最小的例子)。我正在做的实际注释类似于:

F('my_integer') + Count('users') + 1

不能重新排列:(

它的查询也有效:

  • 没有过滤器()
  • 没有计数()
  • 通常在SQLite3上

我正在执行查询的表是一个沉重的河马,所以我不能做任何python级别的处理。我已经尝试将它分成不同的注释,使用Case / When来捕获任何div 0错误,以及将计算移动到filter()但无效。

我做错了吗?我应该开票吗?请帮我上网吧。

Django:1.9.6 - - MySql:5.7.11 - - Python:2.7.10 - - OSX:10.11.4

1 个答案:

答案 0 :(得分:2)

  

您正在使用Django不允许的python关键字integer:请阅读此处了解有关field-name-restrictions的更多信息

我在两个订单案例中检查了原始查询,但聚合在数据库级别保留了相同的顺序:

HAVING (1 + F('my_integer') + Count('users')) < 12

我真的不知道为什么在这种情况下更改顺序很重要,但我发现当您在聚合后尝试使用.count()时会发生错误,如果发生同样的错误也会发生我尝试使用.aggregate(Count('sum'))。所以我建议简单地使用len,尽管它不是优化方式,但我希望它现在可能有所帮助:

len(Task.objects.annotate(
    sum= 1 + F('my_integer') + Count('users')
).filter(
    sum= 10
))