django.db.utils.DataError:除以零

xlpyo6sf  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(113)

我在下面的代码行中得到一个错误:

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的新手,不知道为什么会发生这种情况。
有人知道如何解决这个错误吗?

1cklez4t

1cklez4t1#

我是django的新手,不知道为什么会发生这种情况。
如果除以零,PostgreSQL会引发错误,因为除以零是未定义的。大多数其他数据库在这种情况下返回NULL
由于django-2.2,我们可以使用**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等于零的对象有点奇怪。根据用例,您可能需要检查在哪里创建这些对象,以及是否要避免这样做。

相关问题