Получил неверные расчеты в методе сохранения Django - PullRequest
0 голосов
/ 27 мая 2020
class Product(models.Model):
    price = models.DecimalField('Цена', decimal_places=2, max_digits=9)

class Discount(models.Model):
    product = models.OneToOneField(Product, on_delete=models.CASCADE, verbose_name='Товар', related_name='discount')
    discount_price = models.DecimalField('Скидочная цена', decimal_places=2, max_digits=9, blank=True, null=True)
    discount_percent = models.PositiveSmallIntegerField('Процент скидки (число)', blank=True, null=True)

    def save(self, *args, **kwargs):
        if not self.discount_percent and not self.discount_price:
            raise ValueError('Заполните хотя бы одно поле: процент или скидочная цена')

        if not self.discount_percent:
            self.discount_percent = (self.discount_price // self.product.price) * 100
        elif not self.discount_price:
            self.discount_price = (self.product.price * self.discount_percent) // 100

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

Когда я напишу в админке, скидка_процент без скидки_цена будет правильным. У меня действительно скидка.
Но когда я пишу Discount_price без Discount_percent, Discount_percent всегда имеет значение 0 Screen from the admin

Когда я добавляю много отпечатков, все вводятся данные были правильными, а расчеты - нет. Как я могу это решить?

1 Ответ

2 голосов
/ 28 мая 2020

Проблема с кодом находится в этой строке:

self.discount_percent = (self.discount_price // self.product.price) * 100

В этой строке вы используете разделение этажей. Вместо этого вам нужно использовать нормальное деление. Например, 3 // 5 = 0 и 100 // 105 = 0. Каждый раз, когда число слева больше, чем справа, оно будет равняться 0. Измените строку, указав это:

self.discount_percent = (self.discount_price / self.product.price) * 100

Вычисления должны работать следующим образом: (3/5) * 100 = 60.0 Если это должно быть целое число, вы можете просто обернуть его int()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...