在django-money MoneyField上使用F表达式

时间:2015-11-13 16:30:27

标签: python django django-models

使用Django 1.8.5和django-money 0.7.4,我想使用F表达式更新MoneyField以避免可能的竞争条件。我们假设我将钱包定义为

from moneyed.classes import Money
from django.db.models import F
from django.db import models
from djmoney.models.fields import M0oneyField

class Wallet(models.Model):
    balance = MoneyField(max_digits=5, decimal_places=2, default_currency='EUR')

以下用于充值钱包的代码因AttributeError: 'CombinedExpression' object has no attribute 'children'

而失败
amount_to_add = Money(amount="3", currency="EUR")
wallet = Wallet(balance=10)
wallet.balance = F('balance') + amount_to_add

我还尝试了wallet.balance.amount = F("balance__amount") + 3,它不会立即抛出异常,但随后的wallet.save()会因TypeError: a float is required而失败。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

django-money 0.7.7起支持所有基本F对象操作。 它适用于Django 1.4 +。

答案 1 :(得分:0)

你试过给它一个浮点而不是一个整数吗?尝试:wallet.balance.amount = F("balance__amount") + float(3)

我不确定为什么他们的代码不会自动尝试将整数转换为浮动符号(如果它是它所需要的。)