django.db.utils.DataError: деление на ноль - PullRequest
1 голос
/ 27 мая 2019

Я получаю сообщение об ошибке в следующей строке кода:

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 и не могу понять, почему это происходит ..

Любая идея кого-либокак решить эту ошибку?

Спасибо

1 Ответ

2 голосов
/ 27 мая 2019

Я новичок в django и не могу понять, почему это происходит ..

PostgreSQL выдает ошибку, если вы делите на ноль, так как деление на ноль не определено.Большинство других баз данных возвращают NULL в этом случае.

Поскольку , мы можем использовать 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 равно нулю.В зависимости от варианта использования вы можете проверить, где вы создаете эти объекты и хотите ли вы этого избежать.

...