以下代码行中出现错误:
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的新手,无法弄清为什么会这样。
有人知道如何解决此错误吗?
谢谢
答案 0 :(得分:2)
我是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
等于零的对象有些奇怪。根据使用情况,您可能需要检查在何处创建这些对象,以及是否要避免这种情况。