如何使用Django Rest Framework与VueJs实现公告状态自动变更?
公告30天自动失效实现方案
一共提供两类实现思路,可根据你的业务场景选择:
方案1:被动动态判定(优先推荐)
不需要引入额外定时任务组件,逻辑全部收拢在后端DRF侧,稳定性最高:
- 首先给公告模型新增
expire_at字段,创建公告时自动计算30天后的时间作为过期时间,同时新增动态属性判定当前公告是否有效:
from django.db import models from django.utils import timezone class Announcement(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) # 过期时间字段,首次创建时自动赋值 expire_at = models.DateTimeField() is_active = models.BooleanField(default=True) def save(self, *args, **kwargs): if not self.pk: self.expire_at = timezone.now() + timezone.timedelta(days=30) super().save(*args, **kwargs) # 动态返回真实生效状态,不需要修改数据库 @property def actual_is_active(self): return self.is_active and (timezone.now() < self.expire_at)
- DRF序列化器直接返回
actual_is_active字段给前端,替代原有is_active字段即可。如果需要查询生效的公告,直接加过滤条件expire_at__gt=timezone.now(), is_active=True即可,性能开销极低。
方案2:定时任务主动修改is_active状态
如果业务要求is_active状态必须真实落库(比如有其他强依赖该字段数据库值的逻辑),可以选以下两种轻量实现:
方案2.1 Django Q + 异步任务(适合中小项目)
- 安装
django-q后完成基础配置,新增任务函数:
# app/tasks.py from django.utils import timezone from .models import Announcement def deactivate_expired_announcement(announcement_id): try: ann = Announcement.objects.get(id=announcement_id) ann.is_active = False ann.save() except Announcement.DoesNotExist: return
- 在公告模型的
save方法中,首次创建时调度30天后执行对应任务即可,启动Django Q worker进程后就能自动运行。
方案2.2 Django自定义命令 + 系统Crontab(无额外依赖,最稳定)
- 新增Django自定义命令,批量更新过期公告状态:
# app/management/commands/deactivate_expired_anns.py from django.core.management.base import BaseCommand from django.utils import timezone from app.models import Announcement class Command(BaseCommand): help = "批量失效过期30天的公告" def handle(self, *args, **options): update_count = Announcement.objects.filter( is_active=True, created_at__lte=timezone.now() - timezone.timedelta(days=30) ).update(is_active=False) self.stdout.write(f"已失效{update_count}条过期公告")
- 在服务器配置crontab每天定时执行命令即可,示例配置:
0 0 * * * /虚拟环境路径/bin/python /项目路径/manage.py deactivate_expired_anns
Vue侧处理
无论选用哪种后端方案,前端仅需要根据后端返回的生效状态字段判断是否展示公告即可,所有时间判定逻辑收拢在后端处理,避免前端本地时间被篡改导致逻辑异常。
内容的提问来源于stack exchange,提问作者mirodil
相关产品推荐
相关产品推荐

