我在以下代码行中收到错误:
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 新手,无法弄清楚为什么会发生这种情况..
有人知道如何解决这个错误吗?
我是 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
。
话虽如此,数据库中的对象 quantity
和
quantity_purchase
等于 0,这有点 奇怪。根据用例,您可能需要检查创建这些对象的位置,以及是否要避免这种情况。