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

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

补充说明

  1. 用date.today()替代datetime.today():模型字段是DateField,用日期类型匹配更准确,避免datetime带时间部分的隐性问题。
  2. 用.first()替代[0]:无匹配结果时.first()返回None,不会抛出索引错误,代码更安全。

内容的提问来源于stack exchange,提问作者IanL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:15:40