2012-06-05 26 views
0

我想弄清楚如何乘以整数字段值的十进制字段值。Django整数和十进制字段乘法

这里是我的模型:

class OrderItem(models.Model): 
    order = models.ForeignKey(Order, editable=False) 
    product = models.ForeignKey('products.Product') 
    qty = models.IntegerField() 
    original_price = models.DecimalField(max_digits=20, decimal_places=2) 
    sale_price = models.DecimalField(max_digits=20, decimal_places=2) 
    tax = models.DecimalField(max_digits=20, decimal_places=2) 
    total = models.DecimalField(max_digits=2, decimal_places=2, null=True, blank=True, editable=False) 
    total_tax = models.DecimalField(max_digits=2, decimal_places=2, null=True, blank=True, editable=False) 
    picked = models.IntegerField(null=True, blank=True) 
    user = models.ForeignKey('auth.User', editable=False) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 

我被“数量”一栏试图多了“SALE_PRICE”列,但出现以下错误:

Invalid literal for Decimal: u'180.00180.00' 

使用此代码:

def orderItemPs(sender, instance=False, **kwargs): 
    #figure out the total 
    instance.total = decimal.Decimal(int(instance.qty) * instance.sale_price) 
    instance.total_tax = decimal.Decimal(int(instance.qty) * instance.tax) 
    #disconnect 
    post_save.disconnect(orderItemPs, sender=OrderItem) 
    instance.save() 
    #reconnect 
    post_save.connect(orderItemPs, sender=OrderItem) 

我不知道我在做什么错。

干杯, Sn0rcha!

更新:更多信息。

我已将触发post_save函数的代码更改为以下代码。

order_item = OrderItem(order=form, product=Product.objects.get(pk=products[i]), qty=int(qtys[i]), original_price=decimal.Decimal(original_prices[i]), tax=decimal.Decimal(taxs[i]), user=request.user, sale_price=decimal.Decimal(sale_prices[i])) 

确保我在保存模型之前正确投射表单值。我换了2号线在后保存功能:

instance.total = decimal.Decimal(instance.qty * instance.sale_price) 
instance.total_tax = decimal.Decimal(instance.qty * instance.tax) 

但是现在我得到的错误:

quantize result has too many digits for current context 

我使用的是Postgres并不在于它是一个错误在它的结束。

+0

不应该将总数转换为float而不是int吗? –

+0

@ArgsKwargs:数量是可数的。 –

+0

您的模式是否与您的模型相匹配? –

回答

1

我猜int(instance.qty)2instance.sale_price'180.00' - 一个字符串,而不是一个数值,当其乘以二,只是复制字符串:

>>> decimal.Decimal(2 * '180.00') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/decimal.py", line 548, in __new__ 
    "Invalid literal for Decimal: %r" % value) 
    File "/Library/Frameworks/EPD64.framework/Versions/7.2/lib/python2.7/decimal.py", line 3844, in _raise_error 
    raise error(explanation) 
decimal.InvalidOperation: Invalid literal for Decimal: '180.00180.00' 

如何sale_price被设置?我希望Django将它转换为Decimal,但它有可能以某种方式存储为字符串?

+0

当然是。但只有一种可能发生的方式。 –

+0

我不明白蟒蛇是如何有这个问题,使我坚果=/ –

+1

@ IgnacioVazquez-Abrams我道歉,如果这种方式对除了我以外的所有人都是显而易见的,但如果真的只有一种方式可以发生,那么请告诉。 – Karmel