如何将包含位与运算的SQL查询语句转换为对应Django ORM代码
位与运算SQL转Django ORM实现方案
你给出的SQL是查询goods表中所有满足id与1按位与结果为1(也就是id为奇数)的记录id,对应Django ORM可以按版本选择以下实现方式:
Django 3.2及以上版本(推荐最简写法)
Django 3.2开始内置了__bitand位与查找表达式,直接写即可:
from yourapp.models import Goods # 等效于SELECT id FROM goods WHERE (goods.id & 1) = 1 result = Goods.objects.filter(id__bitand=1).values_list("id", flat=True)
注意:如果你的模型没有显式指定表名,需要在Goods模型的Meta类中添加
db_table = "goods",保证和你SQL中的表名对应。
Django 2.2 ~ 3.1版本
可以使用内置的BitAnd函数结合注解实现:
from django.db.models import F, Value from django.db.models.functions import BitAnd from yourapp.models import Goods result = Goods.objects.annotate( bit_res = BitAnd(F("id"), Value(1)) ).filter(bit_res=1).values_list("id", flat=True)
低于2.2的旧版本(应急写法,不推荐长期使用)
可以用extra方法直接写原生条件:
from yourapp.models import Goods result = Goods.objects.extra(where=["(id & 1) = 1"]).values_list("id", flat=True)
extra方法已被Django官方标记为废弃,仅适合老项目临时兼容使用,有版本升级条件建议优先选前两种写法。
以上写法可以通用扩展到其他位与查询场景,只需要替换对应位与的数值即可。
内容的提问来源于stack exchange,提问作者realhuhu
相关产品推荐
相关产品推荐

