Как переопределить метод 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