Django 公共模型字段的设置和继承(AuditBaseModel、ApprovalBaseModel)

 

auto_now_add=Trueauto_now=True 的使用

在 Django 中,使用 auto_now_add=Trueauto_now=True 是一个简洁和常见的方法,来自动管理创建和更新时间戳。两者的具体用法和区别如下:

auto_now_add=True

  • 行为:在对象第一次被创建时,将字段设置为当前日期和时间。
  • 适用场景:适用于需要记录对象创建时间戳的字段,并且该时间戳在对象创建后不应再改变。

auto_now=True

  • 行为:每次保存对象时,将字段设置为当前日期和时间。
  • 适用场景:适用于需要记录对象最后修改时间的字段,每次对象被修改时更新这个时间戳。

区别和对比

  • auto_now_add=True:

    • 仅在对象创建时自动设置字段值。
    • 创建后无法通过表单或管理员界面修改,确保创建时间始终准确。
    • 简化了创建时间字段的处理。
  • default=now:

    • 提供更多灵活性,可以在对象实例化时手动设置初始值。
    • editable=False 结合使用,防止通过表单手动编辑。
    • 对于需要手动设置初始时间的情况有用,但通常不如 auto_now_add 简洁。

推荐使用方法

对于大多数情况下的创建和更新时间戳管理,使用 auto_now_add=Trueauto_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
复制代码

 

posted @   侬侬发  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示