Django - получить поле auto_now в сигнале pre_save - PullRequest
1 голос
/ 03 июля 2019

Я использую 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_at и responded_by, чтобы они были равны updated_at и updated_by. В этом сигнале значение updated_by уже новое, как должно быть в конце запроса, но значение updated_at - нет. Это старое (текущее) значение. Я хочу, если возможно, иметь возможность получить значение, которое должно быть в поле updated_at после сохранения.

Причина, по которой я использую сигнал pre_save, а не post_save, заключается в том, что я обновляю экземпляр внутри него.

1 Ответ

0 голосов
/ 17 июля 2019

Поскольку вы используете auto_now с полем updated_at, оно унаследует editable=False и blank=True.

как состояние docs :

Как в настоящее время реализовано, установка для 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 должно быть редактируемым, и ваш сигнал должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...