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

如何在Django模型中实现SQL定义的created_at与updated_at字段特性

问题解答

核心原因

Django原生的auto_now_add、auto_now参数是ORM层面实现的自动赋值逻辑,不会在数据库表结构中生成对应的DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP约束,因此直接查看数据库表结构会看不到对应的默认值配置。

修正后的完整Model代码(适配Django 5.0+版本,完全匹配SQL定义)

from django.db import models
from django.db.models.functions import Now

class Package(models.Model):
    name = models.CharField(max_length=200, null=False)
    start = models.DateTimeField(null=False)
    expiry = models.DateTimeField(null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=False)
    count = models.IntegerField(null=True, blank=True)
    # 匹配SQL的created_at定义
    created_at = models.DateTimeField(
        null=False,
        db_default=Now(precision=6)
    )
    # 匹配SQL的updated_at定义
    updated_at = models.DateTimeField(
        null=True,
        blank=True,
        db_default=None,
        db_on_update=Now(precision=6)
    )

    def __str__(self):
        # 修正原代码返回不存在的self.user的错误
        return self.name

    class Meta:
        # 匹配SQL中的表名,不需要自动生成的app名前缀可删除该配置
        db_table = 'billing_package'

适配低版本Django的补充说明

如果你使用的是5.0以下的Django版本,不支持db_on_update参数,无法直接通过字段配置实现数据库层面的更新自动赋值逻辑,需要按以下步骤操作:

  1. 先正常生成迁移文件,执行python manage.py makemigrations
  2. 打开生成的迁移文件,在operations列表末尾添加以下SQL执行语句:
migrations.RunSQL(
    "ALTER TABLE billing_package MODIFY COLUMN updated_at datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6);"
)
  1. 执行迁移python manage.py migrate即可实现完全匹配的字段效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:27:01