如何在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参数,无法直接通过字段配置实现数据库层面的更新自动赋值逻辑,需要按以下步骤操作:
- 先正常生成迁移文件,执行
python manage.py makemigrations - 打开生成的迁移文件,在
operations列表末尾添加以下SQL执行语句:
migrations.RunSQL( "ALTER TABLE billing_package MODIFY COLUMN updated_at datetime(6) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6);" )
- 执行迁移
python manage.py migrate即可实现完全匹配的字段效果。
内容的提问来源于stack exchange,提问作者user892134
相关产品推荐
相关产品推荐

