Tengo este modelo:

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)

Lo que estoy tratando de hacer aquí es calcular y guardar automáticamente el valor total (cantidad * cantidad). Esto es algo que necesito tener disponible como un campo, pero debe calcularse automáticamente. Sin embargo, aparece este error:

no se puede multiplicar la secuencia por no int del tipo 'str'

Cuando miro los resultados de print () e print (type ()) ... veo que, de hecho, estos campos son cadenas aunque contienen los números que espero:

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

En la vista, así es como guardo registros:

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

¿Por qué sucede esto?

0
User402841 14 oct. 2019 a las 18:31

1 respuesta

La mejor respuesta

Como se menciona en los comentarios, puede convertirlo manualmente:

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

Sin embargo, realmente te recomendaría que uses formularios. En el código anterior, si request.POST["amount"] está vacío o contiene una cadena que no se puede convertir a un decimal, obtendría una excepción. Podría captar eso, por supuesto, pero el formulario no solo lo haría por usted, sino que también proporcionaría un mensaje de error útil al usuario en la plantilla sobre qué valor se espera.

1
Daniel Roseman 15 oct. 2019 a las 07:39