Django REST开发求职门户如何更新剩余天数并自动删除过期职位
解决方案
你当前的days_left仅在Jobs实例执行save()方法时计算一次,后续日期变化不会主动触发重新计算,所以会出现剩余天数不变的问题,以下是可直接落地的实现方案:
一、实现剩余天数自动递减
方案1:动态属性替代存储字段(优先推荐)
days_left可通过before_date和当前日期实时计算,不需要实际存储到数据库,完全避免额外的更新维护成本,直接修改模型即可:
from django.utils import timezone from datetime import date class Jobs(models.Model): post_date = models.DateField(default=date.today, blank=False, editable=False) before_date = models.DateField(blank=False) # 动态属性,每次访问实时计算剩余天数 @property def days_left(self): return (self.before_date - date.today()).days
修改后无需调整序列化逻辑,直接把days_left正常加入序列化器字段列表即可使用,返回的值天然随时间递减。同时可删除原模型中days_left字段、以及save方法中关于days_left的计算逻辑。
方案2:保留存储字段+定时更新
如果业务需要把days_left存到数据库做库层面的排序、筛选,可以配合定时任务每天凌晨统一更新所有职位的剩余天数:
import datetime from django.db import models def update_all_days_left(): today = datetime.date.today() # 未过期职位更新剩余天数 Jobs.objects.filter(before_date__gt=today).update( days_left=models.F("before_date") - today ) # 已过期职位剩余天数置为0 Jobs.objects.filter(before_date__lte=today).update(days_left=0)
把上述方法放到定时任务中每天执行一次即可。
二、过期职位自动处理
根据业务需求可二选一:
方案1:定时硬删除
每天定时执行删除逻辑,直接把过期职位从数据库删除:
import datetime def delete_expired_jobs(): today = datetime.date.today() Jobs.objects.filter(before_date__lt=today).delete()
如果使用django-crontab实现定时任务,只需要在settings.py中配置执行规则:
INSTALLED_APPS = [ # ... 其他应用 'django_crontab', ] CRONJOBS = [ # 每天凌晨1点执行更新剩余天数任务 ('0 1 * * *', '你的应用目录.utils.update_all_days_left'), # 每天凌晨1点1分执行删除过期职位任务 ('1 1 * * *', '你的应用目录.utils.delete_expired_jobs'), ]
配置完成后执行python manage.py crontab add即可把规则写入系统定时任务。如果用Celery,把两个方法封装为Celery定时任务即可。
方案2:查询过滤软删除
如果不需要删除历史数据,可通过自定义模型管理器自动过滤过期职位,对用户感知和删除一致,同时保留全部数据:
import datetime from django.db import models # 自定义管理器,自动过滤过期职位 class JobsManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(before_date__gte=datetime.date.today()) class Jobs(models.Model): # ... 原有字段不变 objects = JobsManager() # 替换默认管理器,普通查询自动过滤过期职位 all_objects = models.Manager() # 保留全量查询入口,供后台管理使用
后续所有业务查询调用Jobs.objects.xxx时会自动过滤掉过期职位,不需要额外写过滤条件。
内容的提问来源于stack exchange,提问作者bijay limbu
相关产品推荐
相关产品推荐

