Статистика в шаблоне показывает комбинированное выражение для одного поля
У меня проблема с рендером шаблона. Он показывает таблицу статистики для модели Document (количество просмотров, скачиваний, лайков, антилайков), но view_count в конечном html не является числом, это объект CombinedExpression, как F(view_count) + Value(1). Возможно, причина моей проблемы в том, что я обновляю статистику и добавляю ее в шаблон в одной и той же части кода
# views.py
class DocumentDetailView(DetailView):
...
def get(self, request, *args, **kwargs):
self.object = self.get_object()
self.statistic = FileStatistic.objects.get(document=self.object)
self.statistic.increment_field('view_count')
context = self.get_context_data(object=self.object, statistic=self.statistic)
return self.render_to_response(context)
# models.py
# NOTE: this model class is OneToOneField referenced in Document model class.
class FileStatistic(models.Model):
download_count = models.IntegerField(
default=0,
verbose_name='Количество скачиваний'
)
view_count = models.IntegerField(
default=0,
verbose_name='Количество просмотров'
)
like_count = models.IntegerField(
default=0,
verbose_name='Количество лайков'
)
dislike_count = models.IntegerField(
default=0,
verbose_name='Количество дизлайков'
)
def increment_field(self, field_name: str) -> None:
setattr(self, field_name, models.F(field_name) + 1)
self.save(update_fields=[field_name])
<table class="table table-borderless table-sm">
<thread>
<tr>
<th class="text-center" scope='col'>Число скачиваний</th>
<th class="text-center" scope='col'>Число просмотров</th>
<th class="text-center" score='col'>Число лайков</th>
<th class="text-center" score='col'>Число дизлайков</th>
</tr>
</thread>
<tbody>
<tr>
<td class="text-center border-top">{{statistic.download_count}}</td>
<td class="text-center border-top">{{statistic.view_count}}</td>
<td class="text-center border-top">{{statistic.like_count}}</td>
<td class="text-center border-top">{{statistic.dislike_count}}</td>
</tr>
</tbody>
</table>
Ответ был следующим: добавьте self.statistic.refresh_from_db() после self.statistic.increment_field('view_count') в метод DocumentDetailView get.
