Предположим, у нас есть следующие классы:
class Cart(models.Model):
total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
а также
class CartItem(models.Model):
cart = models.ForeignKey(Cart, related_name='items', on_delete=models.CASCADE)
Я хочу обновлять общую сумму каждый раз, когда в корзину добавляется элемент корзины. Когда/как я могу вызвать здесь свой метод добавить это вверх ()?
Думал об использовании такого сигнала, но это не срабатывает:
@receiver(post_save, sender=CartItem, weak=False)
def post_save_cartItem_receiver(sender, instance, *args, **kwargs):
print("inside signal")
Here's my very simplified addToCart() method:
def add(self, request, product_id, cart_obj):
product = get_object_or_404(Product, id=product_id)
CartItem.objects.create(cart=cart_obj, ...)
cart_obj.save()
return True
Это мой первый вопрос здесь, если я могу лучше объяснить, пожалуйста, скажите мне.
Добро пожаловать в StackOverflow.
Распространенная проблема, с которой сталкиваются люди при создании триггеров, заключается в том, что они забывают (или не знают) импортировать сигналы в свой файл apps.py
. Это единственная причина, по которой я могу предположить, что ваш сигнал не сработает.
Я предполагаю, что ваш файл apps.py
должен выглядеть примерно так (если имя вашего приложения Shop
):
from django.apps import AppConfig
class ShopConfig(AppConfig):
name = 'Shop'
def ready(self):
import Shop.signals
Затем вы можете использовать сигнал post_save
для CartItem, чтобы получить связанную с ним корзину, сложить общую стоимость и сохранить корзину с новой суммой.
ууууу! это единственная вещь, которую люди склонны упускать при работе с сигналами. Сигналы СУПЕР полезны, так что получайте удовольствие