如何在Django Model中自动填充时间戳字段?
解决Django模型中创建双时间字段的需求
针对你的需求,这里提供一个直接可行的方案,避开auto_now_add和auto_now带来的字段不可编辑问题,同时满足:
created_at为必填字段,支持手动输入或自动生成(按需选择)updated_at初始值与created_at一致,后续可独立更新且不影响created_at
模型代码实现
from django.db import models from django.utils import timezone class MyClass(models.Model): # 方案1:强制用户创建时手动输入created_at(必填) created_at = models.DateTimeField() # 方案2:系统自动填充当前时间,同时允许用户修改(仍为必填) # created_at = models.DateTimeField(default=timezone.now) updated_at = models.DateTimeField() def save(self, *args, **kwargs): # 新建对象时,若未设置updated_at,自动同步created_at的值 if not self.pk and not self.updated_at: self.updated_at = self.created_at super().save(*args, **kwargs)
关键说明
- 避开
auto_now_add/auto_now的原因:这两个参数会默认将字段的editable设为False,导致在admin或自定义表单中无法显示/编辑字段,完全不符合你需要独立更新updated_at的需求。 - 必填字段设置:去掉
null=True,Django默认null=False,保证数据库层面字段不为空,满足必填要求。 - 初始值同步逻辑:通过重写
save方法,在对象首次创建且未手动设置updated_at时,自动将其值设为created_at,确保初始一致;后续更新时,你可以任意修改updated_at,created_at不会被影响。
可选:Admin后台优化
如果你希望created_at仅在创建时可编辑,后续更新时只读,可以在admin配置中添加:
from django.contrib import admin from .models import MyClass @admin.register(MyClass) class MyClassAdmin(admin.ModelAdmin): readonly_fields = ('created_at',) # 若使用方案1(手动输入created_at),创建时会显示该字段让用户输入,编辑时变为只读
内容的提问来源于stack exchange,提问作者atp55
相关产品推荐
相关产品推荐

