django.db.utils.DataError:除以零

时间:2019-05-27 10:13:47

标签: django django-views

以下代码行中出现错误:

context['stock_margin'] = context['top_stock'].annotate(
                            Avg_purchase = ExpressionWrapper(F('total_puchase') / F('quantity_purchase'), output_field=FloatField()),
                            Avg_sales = ExpressionWrapper(F('total') / F('quantity'), output_field=FloatField())) 

我是django的新手,无法弄清为什么会这样。

有人知道如何解决此错误吗?

谢谢

1 个答案:

答案 0 :(得分:2)

  

我是django的新手,无法弄清为什么会这样。

如果除以零,PostgreSQL会引发错误,因为除以零是未定义的。在这种情况下,大多数其他数据库返回NULL

起,我们可以使用NullIf [Django-doc],从而可以使用:

from django.db.models.functions.comparison import NullIf

context['stock_margin'] = context['top_stock'].annotate(
    Avg_purchase = ExpressionWrapper(
        F('total_puchase') / NullIf(F('quantity_purchase'), 0),
        output_field=FloatField()
    ),
    Avg_sales = ExpressionWrapper(
        F('total') / NullIf(F('quantity'), 0),
        output_field=FloatField()
    )
)

否则,您可以使用Case [Django-doc]

from django.db.models import Case, When

context['stock_margin'] = context['top_stock'].annotate(
    Avg_purchase = Case(
        When(quantity_purcase__gt=0, then=F('total_puchase') / F('quantity_purchase')),
        default=None,
        output_field=FloatField()
    ),
    Avg_sales = Case(
        When(quantity__gt=0, then=F('total') / F('quantity')),
        default=None,
        output_field=FloatField()
    )
)

如果purchase_quantity / quantity大于零,则执行除法,否则返回None。在两种情况下,对于除以零的记录,我们都将返回None

话虽这么说,您的数据库中有quantityquantity_purchase等于零的对象有些奇怪。根据使用情况,您可能需要检查在何处创建这些对象,以及是否要避免这种情况。