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

Предположим, у нас есть следующие классы:

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

Это мой первый вопрос здесь, если я могу лучше объяснить, пожалуйста, скажите мне.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
165
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в 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, чтобы получить связанную с ним корзину, сложить общую стоимость и сохранить корзину с новой суммой.

ууууу! это единственная вещь, которую люди склонны упускать при работе с сигналами. Сигналы СУПЕР полезны, так что получайте удовольствие

rchurch4 29.05.2019 16:42

Другие вопросы по теме