Django 公共模型欄位的設定和繼承(AuditBaseModel、ApprovalBaseModel)

侬侬发發表於2024-07-25

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

相關文章