Как переопределить метод update модели в django

Я использую django с python. Я пытаюсь обновить модель каждый раз, когда поле обновляется, в данном случае, поскольку у меня есть лямбда-функция в облаке, я хочу, чтобы когда запрос postgres обновляет экземпляр модели, во время действия обновления, обновить возраст модели Person ниже:

data

Контактная таблица

id = 1

name = 'john'

возраст = 38

sql

UPDATE contacts_contact SET name = 'jane' where id = '1';   # this works fine 

Теперь я хочу убедиться, что при изменении имени на jane, как указано выше, возраст автоматически обновляется в django с помощью метода переопределения

django

class Contact(models.Model):
    ..
    name = models.CharField()
    age = models.IntegerField()

    def update(self, *args, **kwargs):
        if self.age:
            self.age = 25
        super().update(*args, **kwargs)                     # i tried this
        super(Contact, self).update(*args, **kwargs)        # i tried this too

оба метода обновления, которые я пробовал выше, не обновляют возраст человека, несмотря на то, что обновление sql-запроса сработало

есть ли что-то, что я упускаю?

PS: Я хочу обновить это поле именно в django, а не в sql-запросе

"I am using django with python. I am trying to update the model whenever a field is updated" если это так, то django signals может помочь вам, фактически они созданы только для этой цели.

выполните следующие шаги, чтобы включить django-signals для ваших моделей.

Внутри вашего_app/app.py вы можете найти фрагменты, как показано ниже. если нет, вставьте то же самое и измените его с именем вашего приложения. здесь вы просто импортируете сигналы (содержимое в вашем_app/signal.py)

from django.apps import AppConfig


class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app'
    verbose_name = 'Your App'

    def ready(self):
        import your_app.signals

Внутрь файла your_app/signals.py вставьте содержимое ниже. измените его, указав свое имя модели. сейчас я буду использовать вашу Contact модель.

from django.db.models.signals import post_save
from your_app.models import Contact
from django.dispatch import receiver


@receiver(post_save, sender=Contact)
def create_user(sender, instance, created, **kwargs):
    print(sender)
    print(instance)
    print(kwargs)
    if created:
        print('Hurray its created', created)

Здесь вы можете использовать сигнал post_save. Django включает в себя "диспетчер сигналов", который помогает разделенным приложениям получать уведомления о действиях, происходящих в других частях фреймворка. В двух словах, сигналы позволяют определенным отправителям уведомлять набор получателей о том, что произошло какое-то действие.

всякий раз, когда вы вызываете метод .save() модели Contact (create/update). например -

c = Contact(name='zzz', age=20)

c.save()

теперь это сделает сигнал post_save, чтобы получить уведомление об изменениях, вы можете проверить то же самое в ваших заявлениях печати метода create_user(). отсюда вы можете делать все, что хотите с вашей моделью.

подробнее о сигналах post_save вы можете прочитать здесь https://docs.djangoproject.com/en/4.0/ref/signals/#post-save

Вернуться на верх