Django中查询今日前后日期范围的DateField未返回预期对象
Django薪资周期查询函数问题排查
问题背景
我正在开发一个Django应用,定义了如下PayPeriods模型:
class PayPeriods(models.Model): first_day = models.DateField(default=date.today) last_day = models.DateField(default=date.today) pay_day = models.DateField(default=date.today)
编写了获取当前薪资周期的函数:
def get_pp(): _pp = PayPeriods.objects.filter(first_day__gte=datetime.today(),last_day__lt=datetime.today())[0] return _pp
当前日期为2022年11月29日,期望返回PP Object #4(first_day=11/17/22,last_day=12/10/22),但函数未返回预期结果。现有数据:
PP Object #3: first_day = 11/13/22, last_day = 11/26/22 PP Ojbect #4: first_day = 11/17/22, last_day = 12/10/22 PP Ojbect #5: first_day = 12/11/22, last_day = 12/24/22
已验证数据日期格式与datetime.today()一致,时区设置正确,需排查问题所在。
问题原因
查询条件逻辑完全错误:
first_day__gte=datetime.today()要求薪资周期起始日大于等于当前日期,但PP#4的起始日11/17/22早于11/29/22,不满足该条件。last_day__lt=datetime.today()要求薪资周期结束日小于当前日期,PP#4的结束日12/10/22晚于11/29/22,也不满足该条件。
两个条件叠加后没有匹配数据,直接取索引[0]还会抛出IndexError。
修正方案
要查询当前日期处于周期内的薪资周期,正确逻辑是当前日期大于等于周期起始日、且小于等于周期结束日,修正后的函数如下:
from datetime import date def get_pp(): today = date.today() # 匹配当前日期在first_day和last_day之间(包含边界)的薪资周期 _pp = PayPeriods.objects.filter(first_day__lte=today, last_day__gte=today).first() return _pp
补充说明
- 用
date.today()替代datetime.today():模型字段是DateField,用日期类型匹配更准确,避免datetime带时间部分的隐性问题。 - 用
.first()替代[0]:无匹配结果时.first()返回None,不会抛出索引错误,代码更安全。
内容的提问来源于stack exchange,提问作者IanL
相关产品推荐
相关产品推荐

