如何将匹配年份区间的SQL查询转换为Django ORM查询?
将指定SQL转换为Django ORM查询
场景背景
现有数据表结构如下,查询参数为2018:
| id | registration_year |
|---|---|
| 1 | 2014-2016 |
| 2 | 2017-2019 |
对应的SQL查询语句为:
SELECT id FROM table_name WHERE SUBSTRING(registration_year,1,4) <= 2018 AND SUBSTRING(registration_year,6,4) >= 2018
执行该SQL将得到id=2的结果,需将此查询转换为Django ORM语句。
实现代码
首先导入Django提供的Substr数据库函数,再通过模型的filter方法构建查询条件:
from django.db.models import Substr # 假设你的模型类名为TableModel,对应数据库表table_name matched_ids = TableModel.objects.filter( Substr('registration_year', 1, 4) <= '2018', Substr('registration_year', 6, 4) >= '2018' ).values_list('id', flat=True)
补充说明
Substr函数与SQL中的SUBSTRING功能完全对应,参数依次为字段名、起始截取位置(1-based,和SQL规则一致)、截取长度- 使用
values_list('id', flat=True)会返回一个仅包含符合条件id的一维列表,和原SQL的查询输出一致 - 如果确认符合条件的结果只有一条,可将
values_list替换为.first(),直接获取对应的模型实例(无匹配时返回None)
内容的提问来源于stack exchange,提问作者user22264561
相关产品推荐
相关产品推荐

