无法将{'price_total__sum':十进制('258.00')}转换为十进制

时间:2016-09-21 19:38:01

标签: python django virtualenv

当我对整列进行求和时,我收到此错误:

Cannot convert {'price_total__sum': Decimal('258.00')} to Decimal

这里是整个项目:https://github.com/pierangelo1982/djangocommerce/tree/berge

def add_to_order(request):
    if request.method == "POST":
        form = AddOrderForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.published_date = timezone.now()
            post.tot_price = CartItem.objects.filter(user_id=request.user.id).aggregate(Sum('price_total'))
            post.save()
            cart_list = CartItem.objects.filter(user_id=request.user.id)
            for cart in cart_list:
                formOrder = AddOrderItemForm(request.POST)
                post_cart = formOrder.save(commit=False)
                post_cart.order = post
        post_cart.product = cart.product
        post_cart.composition = cart.composition
        post_cart.price = cart.price
        post_cart.quantity = cart.quantity
        post_cart.total = cart.price_total
        post_cart.price_discount = cart.price_discount
                post_cart.price_reserved = cart.price_reserved
                post_cart.save()
            #cart_list.delete() #cancello carrello dopo ordine
            return redirect('/order', pk=post.pk)
    else:
        form = AddOrderForm()
    return render(request, 'order-form.html', {'form': form})

我的模型订单,接收总和值,以及表格:

class Order(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, verbose_name="Utente")
    code = models.CharField('Codice', max_length=250, null=True, blank=True)
    tot_price = models.DecimalField('Prezzo', max_digits=10, decimal_places=2, blank=True, null=True)
    tot_discount = models.DecimalField('Totale Scontato', max_digits=10, decimal_places=2, blank=True, null=True)
    tot_price_reserved = models.DecimalField('Prezzo Scontato Riservato', max_digits=10, decimal_places=2, blank=True, null=True)
    pub_date = models.DateTimeField('date published', editable=False)
    inlavorazione = models.BooleanField('in lavorazione', default=False)
    pagato = models.BooleanField('pagato', default=False)
    spedito = models.BooleanField('spedito', default=False)
    chiuso = models.BooleanField('chiuso', default=False)

    def save(self, *args, **kwargs):
        self.pub_date = datetime.now()
        super(Order, self).save(*args, **kwargs) # Call the "real" save() method.

    def __unicode__(self):
        return self.pub_date.strftime('%Y-%m-%d')

    class Meta:
        verbose_name_plural = "Ordine"
        ordering = ['id']

形式:

class AddOrderForm(ModelForm):
    class Meta:
        model = Order
        fields = ['user', 'tot_price', 'tot_discount', 'tot_price_reserved']

1 个答案:

答案 0 :(得分:2)

如错误所示,您的aggregate()调用会返回字典:{'price_total__sum': Decimal('258.00')}。您无法在目标模型中将该dict设置为DecimalField;你需要先提取实际值。

price_total = CartItem.objects.filter(user_id=request.user.id).aggregate(Sum('price_total'))
post.tot_price = price_total['price_total__sum']