auto_now_add=True 和 auto_now=True 的使用
在 Django 中,使用 auto_now_add=True 和 auto_now=True 是一个简洁和常见的方法,来自动管理创建和更新时间戳。两者的具体用法和区别如下:
auto_now_add=True
- 行为:在对象第一次被创建时,将字段设置为当前日期和时间。
- 适用场景:适用于需要记录对象创建时间戳的字段,并且该时间戳在对象创建后不应再改变。
auto_now=True
- 行为:每次保存对象时,将字段设置为当前日期和时间。
- 适用场景:适用于需要记录对象最后修改时间的字段,每次对象被修改时更新这个时间戳。
区别和对比
-
auto_now_add=True:
- 仅在对象创建时自动设置字段值。
- 创建后无法通过表单或管理员界面修改,确保创建时间始终准确。
- 简化了创建时间字段的处理。
-
default=now:
- 提供更多灵活性,可以在对象实例化时手动设置初始值。
- 与
editable=False 结合使用,防止通过表单手动编辑。
- 对于需要手动设置初始时间的情况有用,但通常不如
auto_now_add 简洁。
推荐使用方法
对于大多数情况下的创建和更新时间戳管理,使用 auto_now_add=True 和 auto_now=True 是首选,因为它们的意图明确且使用简便。
使用示例
以下是如何在你的 AuditBaseModel 中使用这些属性:
定义 ApprovalBaseModel和定义 AuditBaseModel
from django.conf import settings
from django.db import models
from fwApp.models import FW002HModel
class ApprovalBaseModel(models.Model):
fw_list = models.ForeignKey(FW002HModel, null=True, blank=True, to_field='fw_list',
on_delete=models.PROTECT, related_name='%(class)s_fw_list',
verbose_name="审批单号")
status = models.BooleanField(default=0, verbose_name='是否核准')
rgs_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True,
to_field='username', related_name='%(class)s_rgs_user', verbose_name='审核账号')
rgs_time = models.DateTimeField(null=True, editable=False, blank=True, verbose_name="审核时间")
class Meta:
abstract = True
from django.utils.timezone import now
class AuditBaseModel(models.Model):
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True,
to_field='username', related_name='%(class)s_created_by', verbose_name='创建账号')
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, null=True, blank=True,
to_field='username', related_name='%(class)s_updated_by', verbose_name='更新账号')
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
abstract = True
class CU005HModel(ApprovalBaseModel, AuditBaseModel):
"""
销售订单特结单表头 Close
尚未出货或者部分出货时,终结此笔单据,出多少算多少
"""
cl_no = models.CharField(unique=True, max_length=20, editable=False, verbose_name="销售订单特结单号")
cl_date = models.DateField(default=date.today, editable=False, verbose_name="特结日期")
fa_no = models.ForeignKey(BS001HModel, on_delete=models.PROTECT, related_name='cu005h_fa_no',
to_field='fa_no', verbose_name="厂别")
cu_no = models.ForeignKey(CU001HModel, on_delete=models.PROTECT, related_name='cu005h_cu_no', to_field='cu_no',
verbose_name="客户")
pa_no = models.ForeignKey(PA003HModel, on_delete=models.PROTECT, related_name='cu005h_pa_no', to_field='pa_no',
verbose_name="经办人")
reason = models.CharField(null=True, blank=True, max_length=100, verbose_name="特结原因")
confirm = models.BooleanField(default=False, verbose_name="是否确认")
rgc_user = models.CharField(max_length=20, editable=False, null=True, blank=True, verbose_name="确认账号")
rgc_time = models.DateTimeField(null=True, editable=False, blank=True, verbose_name="确认时间")
class Meta:
db_table = 'cu005h'
verbose_name = '销售订单特结单表头'
verbose_name_plural = verbose_name