Я новичок в django и не могу понять, почему это происходит ..
PostgreSQL выдает ошибку, если вы делите на ноль, так как деление на ноль не определено.Большинство других баз данных возвращают NULL
в этом случае.
Поскольку django-2.2 , мы можем использовать NullIf
[Django-doc] и, следовательно, работайте с:
from django.db.models.functions.comparison import <b>NullIf</b>
context['stock_margin'] = context['top_stock'].annotate(
Avg_purchase = ExpressionWrapper(
F('total_puchase') / <b>NullIf(</b>F('quantity_purchase')<b>, 0)</b>,
output_field=FloatField()
),
Avg_sales = ExpressionWrapper(
F('total') / <b>NullIf(</b>F('quantity')<b>, 0)</b>,
output_field=FloatField()
)
)
В противном случае вы можете использовать Case
[Django-doc] :
from django.db.models import <b>Case, When</b>
context['stock_margin'] = context['top_stock'].annotate(
Avg_purchase = Case(
When(<b>quantity_purcase__gt=0</b>, then=F('total_puchase') / F('quantity_purchase')),
<b>default=None,</b>
output_field=FloatField()
),
Avg_sales = Case(
When(<b>quantity__gt=0</b>, then=F('total') / F('quantity')),
<b>default=None,</b>
output_field=FloatField()
)
)
Если значение purchase_quantity
/ quantity
больше нуля, мы выполняем деление, в противном случае мы возвращаем None
.В обоих случаях для записей, где мы делим на ноль, мы будем возвращать None
.
При этом, немного нечетно , что у вас есть объекты в вашей базе данных с quantity
и quantity_purchase
равно нулю.В зависимости от варианта использования вы можете проверить, где вы создаете эти объекты и хотите ли вы этого избежать.