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

如何在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)

关键说明

  1. 避开auto_now_add/auto_now的原因:这两个参数会默认将字段的editable设为False,导致在admin或自定义表单中无法显示/编辑字段,完全不符合你需要独立更新updated_at的需求。
  2. 必填字段设置:去掉null=True,Django默认null=False,保证数据库层面字段不为空,满足必填要求。
  3. 初始值同步逻辑:通过重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:08