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

如何在Django模型中实现created_at与updated_at字段的自动更新逻辑?

Django模型时间字段逻辑修正方案

问题需求

需要实现以下时间字段逻辑:

  • 新增事件时,管理表单仅显示created_at时间,updated_at字段为空;
  • 编辑已有事件时:
    • 若updated_at字段为空,则自动填充当前时间;
    • 若updated_at已存在,则更新为当前时间。

原代码无法实现该逻辑,以下是修正后的完整代码及说明:

修正后的模型代码

from django.db import models
from django.utils.timezone import now
import uuid


class Types(models.TextChoices):
    LPN = 'LPN'
    RN = 'RN'


class Venue(models.Model):
    type = models.CharField(
        max_length=3,
        choices=Types.choices,
        default=Types.RN
    )
    venue_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(default=now, editable=True, null=True, blank=True)
    updated_at = models.DateTimeField(null=True, blank=True, editable=False)
    
    place_text = models.CharField(max_length=200)
    date = models.DateField('Date')
    start_time = models.DateTimeField('start time')
    finish_time = models.DateTimeField('finish time')
    details = models.CharField(max_length=500)

    def save(self, *args, **kwargs):
        # 编辑操作时更新updated_at
        if self.pk:
            self.updated_at = now()
        super().save(*args, **kwargs)

    def __str__(self):
        return self.place_text

核心修改说明

  1. 修复类结构错误:将Types枚举类调整为合法的定义位置,原代码缩进错误导致枚举类不属于模型类的有效组成部分
  2. 优化updated_at字段配置:
    • 设置editable=False,让管理后台不显示该字段,避免手动干预
    • 移除默认值,确保新增数据时该字段为空
  3. 通过save方法实现自动更新逻辑:
    • 利用self.pk判断操作类型:pk不存在为新增,pk存在为编辑
    • 编辑时强制将updated_at设为当前时间,无论原有值是否为空,完美覆盖需求中的两种编辑场景
  4. 修复__str__方法错误:原代码引用了不存在的venue_text字段,改为实际存在的place_text
  5. 移除无效逻辑:原代码中类定义阶段的if venue_id is True判断完全无效,因为此时还未创建模型实例,无法访问实例字段值

内容的提问来源于stack exchange,提问作者smoothy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:39:18