You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:19