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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:00