Есть ли способ инициировать действие при изменении указанного поля c в моделях Django - PullRequest
0 голосов
/ 18 июня 2020

Я ищу способ инициировать действие всякий раз, когда определенное поле c модели изменяется, независимо от того, где оно изменено.

Чтобы добавить некоторый контекст, я столкнулся с неуловимым ошибка, из-за которой иногда поле даты устанавливается на 13 января 2020 года, я абсолютно не знаю, где в кодовой базе это происходит, это также происходит достаточно редко, чтобы я не смог уловить какой-либо шаблон относительно того, что может быть причиной этого.

Я хотел бы вызвать какое-то предупреждение всякий раз, когда это поле изменяется на 13 января 2020 года, чтобы я мог попытаться изолировать причину этого.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете использовать сигналы post_save и post_init, чтобы знать, когда поле модели изменяется. post_save post_init Он будет запускать предупреждение всякий раз, когда объект обновляется и имеет дату 13 января 2020 г.

from django.db.models.signals import post_save, post_init
import datetime

@receiver(post_init, sender=YourModel)
def remember_previous_date(sender, instance, **kwargs):
    instance.previous_date = instance.your_date_field

@receiver(post_save, sender=YourModel)
def create_user_api_key(sender, instance, created, **kwargs):
    if not created:
        is_date_updated = instance.previous_date != instance.your_date_field
        day = datetime.date(2020, 1, 13)
        if instance.your_date_field == day and is_date_updated:
            trigger_your_alert()
1 голос
/ 18 июня 2020

Не уверен, что это лучший метод, но вы можете перезаписать метод сохранения модели.

    def save(self, *args, **kwargs):
        if self.pk is not None:
            old_instance = YourModel.objects.get(pk=self.pk)
            if old_instance.your_date_field != self.your_date_field:
                trigger_your_alert()

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