使用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
不能重新排列:(
它的查询也有效:
我正在执行查询的表是一个沉重的河马,所以我不能做任何python级别的处理。我已经尝试将它分成不同的注释,使用Case / When来捕获任何div 0错误,以及将计算移动到filter()但无效。
我做错了吗?我应该开票吗?请帮我上网吧。
Django:1.9.6 - - MySql:5.7.11 - - Python:2.7.10 - - OSX:10.11.4
答案 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
))