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

Django按外键关联的exp_days筛选即将到期的文档

修改Django文档到期筛选逻辑,基于关联类型的提醒天数

要实现根据每个文档关联的DocumentType中exp_days字段指定的天数筛选到期文档,你需要使用Django的F表达式和数据库日期函数动态计算每个文档的提醒截止日期,具体步骤如下:

1. 导入必要模块

首先确保导入所需工具类:

from datetime import date
from django.db.models import F
from django.db.models.functions import DateAdd

2. 编写动态筛选查询

替换原固定30天的筛选逻辑,改为根据关联DocumentType的exp_days计算到期范围:

today = date.today()
documents = Document.objects.filter(
    # 排除未设置提醒天数的文档类型
    type__exp_days__isnull=False,
    # 排除未设置到期日期的文档
    date_of_expiry__isnull=False,
    # 动态判断:到期日期 <= 今天 + 文档类型指定的提醒天数
    date_of_expiry__lte=DateAdd(today, F('type__exp_days'), 'day')
)

3. 可选:处理无提醒天数的情况

如果希望对未设置exp_days的文档类型使用默认提醒天数(比如保留原逻辑的30天),可以用Coalesce函数设置默认值:

from django.db.models import Coalesce

today = date.today()
documents = Document.objects.filter(
    date_of_expiry__isnull=False,
    date_of_expiry__lte=DateAdd(today, Coalesce(F('type__exp_days'), 30), 'day')
)

关键说明

  • F表达式:直接引用数据库中关联模型的字段值(type__exp_days),逻辑在数据库层面执行,避免内存加载冗余数据。
  • DateAdd函数:Django提供的跨数据库兼容日期加法函数,确保不同数据库环境下逻辑一致。
  • 空值过滤:通过__isnull=False排除无效数据,避免因exp_days或date_of_expiry为空导致的筛选错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:35:33