django.db.utils.DataError:除以零

问题描述 投票:0回答:1

我在以下代码行中收到错误:

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 新手,无法弄清楚为什么会发生这种情况..

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

python django django-views django-queryset
1个回答
14
投票

我是 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

话虽如此,数据库中的对象 quantity

quantity_purchase
等于 0,这有点
 奇怪
。根据用例,您可能需要检查创建这些对象的位置,以及是否要避免这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.