MalekBV
@MalekBV

Django. Цена не сохраняется при save() методе?

Есть модель:
class ProductSet(models.Model):
    """Set of some products"""
    price = models.DecimalField(max_digits=7, decimal_places=2, blank=True, null=True)
    set_products = models.ManyToManyField(SetProduct, related_name='set', verbose_name='Товары набора')

    def save(self, *args, **kwargs):
        """If a total price for that product set isn't defined,
        save it as a sum of the set products total_price
        """
        if not self.price:
            super().save(*args, **kwargs)
            self.price = sum([set_product.total_price for set_product in self.set_products.all()])

        super().save(*args, **kwargs)


Первый вызов save для сохранения отношения «set_products» «многие ко многим». Второе выражение save для сохранения нового self.price. Но это не работает, цена была сохранена только после того, как я дважды щелкнул по кнопке сохранения администратора django. В чем причина и как я могу это решить?

P.S SetProduct:

class SetProduct(models.Model):
    """Product in ProductSet"""
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='Товар', related_name='product_sets')
    count = models.PositiveSmallIntegerField('Количество', default=1)
    actual_price = models.DecimalField('Актуальная цена', max_digits=7, decimal_places=2, blank=True, null=True)

    def save(self, *args, **kwargs):
        """If an actual price isn't defined, set it as the product.price_with_discount"""
        if not self.actual_price:
            self.actual_price = self.product.price_with_discount

        super().save(*args, **kwargs)

    @property
    def total_price(self):
        return self.actual_price * self.count
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
M2M-поля заполняются админкой только после выхода из save(), super() тут не поможет. Смотрите в сторону обработки сигнала m2m_changed.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы