Django中使用filter进行多值与范围查询及同字段比较

陆遥
陆遥
发布时间:2026-10-14 | 1人浏览过
原创

本文介绍Django ORM中filter的高级用法。首先讲解利用pk__in进行多ID批量查询,以及pk__gt和pk__lt进行范围筛选的方法。随后深入探讨如何结合F对象实现同一Model中两个字段的比较过滤,解决直接比较字段名无效的常见问题,提供实用的代码示例。

Django filter多值与范围查询

为了实现收藏夹功能,需要一次性获取所有指定ID对应的对象。查阅文档后发现,可以通过特定的查询方法实现这一需求。

pk是primary key(主键)的缩写。因此,pk__in表示主键位于某个指定的集合中。以下以Django自带的User模型为例演示具体操作:

User.objects.filter(pk__in=[1,2,3])

执行上述代码即可筛选出ID为1、2、3的User对象,操作十分便捷。

需注意,连接符为两个下划线(__)。

此外,还有pk__gt和pk__lt两个操作符,均用于筛选特定范围的数据。

User.objects.filter(pk__gt=10)

该查询将返回pk(通常即id)大于10的对象(greater)。

User.objects.filter(pk__lt=10)

该查询将返回pk小于10的对象。

同字段比较与F对象应用

补充知识:Django支持比较同一个Model中两个字段的大小,从而进行条件过滤。

在Django ORM中,如何比较同一模型内的两个字段以过滤记录?

例如,在合同场景中,需要比较结束日期(contract_stop_time)和终止日期(end_time)。使用原生SQL可以很容易实现此类比较。

select *from contracts where

contract_stop_time<end_time

在Django的db模块中,必须使用F库(F object)来实现此功能。


from django.db.models import F
from contracts.models import Contracts
contracts = Contracts.objects.filter(contract_stop_time__lt=F('end_time'))

如果直接写成以下形式:

Contracts.objects.filter(contract_stop_time__lt=end_time)

或者写成以下形式:

Contracts.objects.filter("contract_stop_time"<"end_time")

这两种写法都是错误的,无法正常运行。

以上关于Django使用filter进行多值查询、范围筛选及同字段比较的内容分享完毕,希望能对读者有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表