Django模型F表达式除以零错误计算动态运行总数和平均值
Django model F expression divide by zero error when calculating dynamic running total and average
我正在使用 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'])
第二个解决方案是:
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()
我正在使用 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'])
第二个解决方案是:
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()