Django: Как автоматически обновлять экземпляр модели каждый раз, когда обновляется другой экземпляр модели

В проектах интернет-магазинов у меня есть модель Order (в этой модели хранятся экземпляры заказов) и модель Points. В модели Points хранятся бонусные баллы, которые накапливаются пользователями, когда они делают заказы. Но заказ может быть отменен, поэтому я хотел бы иметь возможность отслеживать, когда заказ отменяется (статус экземпляра модели Order меняется на "отменен"), чтобы забрать баллы. Как я могу это сделать?

Используйте сигналы Django: https://docs.djangoproject.com/en/4.0/ref/signals/#django.db.models.signals.post_save

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

Пример:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import Order


@receiver(pre_save, sender=Order)
def post_save_order_handler(sender, instance, created, **kwargs):
    if not created:
    for item in iter(kwargs.get('update_fields')):
        if item == 'status' and instance.status == "cancelled":
           # do something here

Или вы можете аналогично использовать сигнал pre_save и проверить, изменился ли статус с некоторого допустимого на отмененный перед сохранением.

<<<Вы можете поделиться своими моделями и функциями? Вы можете легко реализовать еще два запроса для сохранения точек для пользователя, используя функции размещения заказа и отмены заказа. например

def place_order(request):
       Order.objects.create()
       Point.objects.create(user_id=user_id,points="10")

vice versa для отмены заказа обновить статус заказа и обновить очки на 0 или минус от общего количества.

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