Статистика в шаблоне показывает комбинированное выражение для одного поля

У меня проблема с рендером шаблона. Он показывает таблицу статистики для модели 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>

Выход: enter image description here

Ответ был следующим: добавьте self.statistic.refresh_from_db() после self.statistic.increment_field('view_count') в метод DocumentDetailView get.

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