如何用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
相关产品推荐
相关产品推荐

