如何用Django ORM实现元组搜索以替代即将弃用的extra方法?
Django ORM实现元组IN查询(替代已弃用的extra方法)
Django 3.2 兼容方案(纯ORM)
针对你使用的Django 3.2版本,可以通过自定义Func类并注册对应的lookup规则来实现,修正后的可运行代码如下:
from django.db.models import Func, lookups class ExpressionTuple(Func): template = '(%(expressions)s)' arg_joiner = "," # 为自定义的ExpressionTuple注册In lookup规则 lookups.In.register(ExpressionTuple) # 执行元组IN查询 MyModel.objects.filter( ExpressionTuple('field_a', 'field_b')__in=((1, 2), (3, 4)) )
这段代码会生成你期望的SQL语句:
SELECT * FROM mytable WHERE (field_a, field_b) IN ((1, 2), (3, 4));
Django 4.0+ 原生简化方案
如果你后续升级到Django 4.0及以上版本,ORM原生支持元组形式的IN查询,无需自定义类,直接用以下写法即可:
from django.db.models import F MyModel.objects.filter((F('field_a'), F('field_b'))__in=((1, 2), (3, 4)))
你之前的代码失效原因
你参考的代码片段直接将lookups.In作为参数传入filter()的写法不符合Django 3.2的ORM解析逻辑。正确的做法是让自定义的表达式类与__in lookup结合,或者通过注册lookup规则让ORM识别该表达式的IN查询语法。
内容的提问来源于stack exchange,提问作者Bob Morane
相关产品推荐
相关产品推荐

