不支持的操作数类型*: 'NoneType'和'Decimal

3 投票
3 回答
8293 浏览
提问于 2025-04-17 02:50

我有一个用Django做的应用程序,专门用来管理增值税(VAT)。比如,它可以计算来自欧盟的所有销售的增值税。

vat = purchases[0].vat.vat
eu_sales = Sale.objects.filter(country_type='2')
eu_amount = (eu_sales.aggregate(price = Sum('amount'))['price'])  * vat/100

不过,今天我把我的文件复制到了另一台机器上。然后我收到了一个错误信息:

unsupported operand type(s) for *: 'NoneType' and 'Decimal'

我意识到出现这个错误是因为还没有存储eu_amount的值。换句话说,eu_amount没有值,所以它不能和一个小数值相乘。以下是我在模板中的内容:

{{eu_amount}}

有没有办法过滤这个模板标签?我想说,如果这个值是None(或者说是空值),那么就把它当作0。

3 个回答

0

你是说这个吗?

{% if item %}
    something
{% else %}
    something different
{% endif %}

这个内容来自于 https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

我几乎可以肯定,最近我在某个地方见过这个 .vat.vat ;)

0

把这一行代码

vat = purchases[0].vat.vat

改成

vat = purchases[0].vat.vat or 0

意思是,如果

purchases[0].vat.vat

这个值是空的或者不存在,就把vat的值设为0。这样可以避免出现错误。

6

你可以试着使用一个默认值,像这样。

eu_amount = (eu_sales.aggregate(price = Sum('amount'))['price']) or 0  * vat/100

不过,最好的方法可能是先检查一下你的求和结果是否为空,如果是的话,就显示一个警告信息,因为这种情况不应该发生。

撰写回答