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

