Django DecimalField возвращает строки - PullRequest
0 голосов
/ 14 октября 2019

У меня есть эта модель:

class Item(models.Model):
    amount = models.DecimalField(max_digits=15, decimal_places=2)
    quantity = models.DecimalField(max_digits=15, decimal_places=6)
    total = models.DecimalField(max_digits=15, decimal_places=2)
    def save(self, *args, **kwargs):

        ## Following lines are for debugging only
        print(self.amount)
        print(self.quantity)
        print(type(self.amount))
        print(type(self.quantity))

        self.total = self.amount*self.quantity
        super(Item, self).save(*args, **kwargs)

То, что я пытаюсь сделать здесь, это автоматически рассчитать и сохранить общую стоимость (количество * сумма). Это то, что мне нужно иметь в качествеполе, но оно должно быть вычислено автоматически. Однако я получаю эту ошибку:

не может умножить последовательность на не-int типа 'str'

Когда я смотрюв результатах print () и print (type ()) ... Я вижу, что эти поля действительно являются строками, даже если они содержат ожидаемые мной числа:

982.00
0.008300
<class 'str'>
<class 'str'>

По моему мнению, именно таксохранить записи:

item = new Item()
item.amount = request.POST["amount"]
item.rate = request.POST["rate"]
item.save()

Почему это происходит?

1 Ответ

1 голос
/ 15 октября 2019

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

item.amount = decimal.Decimal(request.POST["amount"])

Я действительно призываю вас использовать формы. В приведенном выше коде, если request.POST["amount"] пусто или содержит строку, которая не может быть преобразована в десятичную, вы получите исключение. Конечно, вы могли бы это понять, но форма не только сделает это за вас, но и предоставит пользователю полезное сообщение об ошибке в шаблоне о том, какое значение ожидается.

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