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

如何用Django QuerySet筛选7天后满3个月的用户?

筛选7天内将创建满3个月的Django用户

我明白你的需求了——你要找的不是近3个月内新建的用户,而是从今天算起,未来7天内刚好创建满3个月的用户。之前用timedelta(90)的问题在于,3个月不是固定的90天,而且逻辑完全不对,咱们换个思路来实现:

方案(Django 3.2+ 推荐)

Django 3.2及以上提供了AddMonths数据库函数,能精准计算日期加N个月的结果,完美解决月份天数不固定的问题。代码如下:

from django.db.models.functions import AddMonths
from datetime import datetime, timedelta

# 取当前日期(忽略时间部分,避免时分秒干扰)
today = datetime.today().date()
# 计算7天后的日期
seven_days_later = today + timedelta(days=7)

# 筛选目标用户
target_users = User.objects.annotate(
    # 给每个用户计算创建满3个月的日期
    three_month_mark=AddMonths('create_date', 3)
).filter(
    # 筛选「满3个月的日期」落在今天到7天后之间的用户
    three_month_mark__range=(today, seven_days_later)
)

逻辑验证(对应你的例子)

当当前日期是2018-05-29时:

  • 创建日期为2018-03-04的用户:3-04 + 3个月 = 6-04,6-04在5-29到6-05(5-29+7天)的区间内,会被筛选出来;
  • 创建日期为2018-04-20的用户:4-20 +3个月=7-20,远超出6-05,不会被选中,完全符合你的要求。

低版本Django兼容方案(3.2以下)

如果你的Django版本低于3.2,没法用AddMonths,可以用dateutil.relativedelta在Python层面计算边界日期,再反向筛选:

from dateutil.relativedelta import relativedelta
from datetime import datetime

today = datetime.today().date()
# 计算「7天后满3个月」对应的最早创建日期:今天+7天 -3个月
min_create_date = today + timedelta(days=7) - relativedelta(months=3)
# 计算「今天满3个月」对应的最晚创建日期:今天 -3个月
max_create_date = today - relativedelta(months=3)

# 筛选创建日期在max_create_date到min_create_date之间的用户
target_users = User.objects.filter(
    create_date__date__range=(max_create_date, min_create_date)
)

注意:这里用create_date__date是为了忽略时间部分,确保日期匹配精准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:35