You need to enable JavaScript to run this app. Django REST开发求职门户如何更新剩余天数并自动删除过期职位
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 17:45:04