簡體   English   中英

Django-在pre_save信號中獲取auto_now字段

[英]Django - get auto_now field in pre_save signal

我正在使用Django 2.1.5。

有一個帶有“ auto_now”字段的模型:

class BaseModel(models.Model):
    id = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True, unique=True, primary_key=True)
    updated_at = models.DateTimeField(db_index=True, auto_now=True)
    updated_by = models.CharField(max_length=200)
    responded_at = models.DateTimeField(db_index=True, null=True, blank=True)
    responded_by = models.CharField(max_length=200, null=True, blank=True)

現在,我有一個pre_save該模型信號,我想更新那里的responded_atresponded_by領域等於updated_atupdated_by 在該信號中, updated_by值已經是新值,應該在請求的末尾,但是updated_at不是。 這是舊的(當前)值。 我希望,如果可能的話,能夠在保存后得到應該在updated_at字段中的updated_at

我使用的原因pre_save信號,而不是post_save是因為我更新里面的實例。

由於您使用的是auto_nowupdated_at領域,它將繼承editable=Falseblank=True

文檔所述

按照當前的實現,將auto_now或auto_now_add設置為True將導致該字段設置為editable = False和blank = True。

為了避免這種情況,您可以編寫一個自定義字段,如下所示:

from django.utils import timezone


class AutoDateTimeField(models.DateTimeField):
    def pre_save(self, model_instance, add):
        return timezone.now()

您可以在BaseModel像這樣使用它:

class BaseModel(models.Model):
    updated_at = models.AutoDateTimeField(default=timezone.now)
    # ...

這樣, updated_at字段應該是可編輯的,並且您的信號應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM