Ошибка деления выражения F модели Django на ноль при вычислении динамического промежуточного итога и среднего значения

Я использую Django 3.2

Я динамически вычисляю значения полей для элемента, которому можно присвоить рейтинг.

Вот фрагмент моего кода:

self.ratings_count = F('ratings_count') + 1
self.ratings_total = F('ratings_total') + rating_value
self.ratings_average =  F('ratings_total') / F('ratings_count')  
self.last_rated = timezone.now()
self.save()  # Divide by zero error here (no records exist in Db)

Я мог бы тривиально обойти это, не используя F-поля (в качестве шага - с сопутствующими условиями гонки). Мой вопрос в том, как мне реализовать желаемое поведение, используя F-выражения?

Первое решение - сохранить значение ratings_count & ratings_total перед использованием его в операции деления, вот так:

self.ratings_count = F('ratings_count') + 1
self.ratings_total = F('ratings_total') + rating_value

self.save(update_fields=['self.ratings_total', 'self.ratings_count']) # try to remove `self` if there are a problme

self.ratings_average =  F('ratings_total') / F('ratings_count')  
self.last_rated = timezone.now()

self.save(update_fields=['ratings_average', 'last_rated']) 

2-е решение:

self.ratings_count = F('ratings_count') + 1
self.ratings_total = F('ratings_total') + rating_value

if self.ratings_count == 0 and self.ratings_total == 0:
    self.ratings_average = rating_value
else:
    self.ratings_average = (F('ratings_total') + rating_value) / (F('self.ratings_count')+1)

self.last_rated = timezone.now()

self.save() 

Вернуться на верх