Django 1.11如何查询两列差值大于指定值的数据
解决Django 1.11中基于字段差值的过滤问题
嘿,我明白你遇到的问题了!你出错的核心原因是把过滤条件直接塞进了annotate()方法里,这可不是它该干的活儿~
错误原因分析
annotate()的作用是给查询集里的每个对象添加一个计算出来的注释字段,而你把realcharge__lt=10000作为参数传进去时,Django会误以为你要创建一个名为realcharge__lt的注释字段,而赋值的10000是个普通整数,它没有Django查询表达式需要的resolve_expression方法,所以才抛出了那个错误。
正确的写法
你需要分两步走:先用annotate()计算出charge和amount的差值,再用filter()对这个计算后的字段进行过滤。另外注意你原SQL是要column1-column2 > 10000,对应Django的查询条件应该是realcharge__gt=10000(gt表示大于,你之前写的lt是小于,要是笔误的话记得调整):
from django.db.models import F # 先计算差值,再执行过滤 Account.objects.annotate(realcharge=F('charge') - F('amount')).filter(realcharge__gt=10000)
这样就能正确执行类似SELECT * FROM account WHERE (charge - amount) > 10000的SQL查询啦。
内容的提问来源于stack exchange,提问作者farzane
相关产品推荐
相关产品推荐

