Django. Как уменьшить количество обращений к базе данных?

Подскажите пожалуйста, как я могу уменьшить количество запросов, я прикреплю код ниже:

models.py

class Post(models.Model):
    ....
    @property
    def views_count(self):
        return PostViews.objects.filter(post=self).count()

class PostViews(models.Model):
    IPAddres= models.GenericIPAddressField(default="111.222.333")
    post = models.ForeignKey(Post, on_delete=models.CASCADE,related_name="post_views_count",)
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.IPAddres

views.py

posts = Post.objects.filter(is_toplevel=True, status=Post.ACTIVE).select_related('author').prefetch_related('tags').select_related('category')

html

{% for post in posts %}
    ....
    {{ post.views_count }}
{% endfor %}

Из-за вызова postview количество просмотров увеличивается на 10 sql...

Вы можете использовать аннотацию Django:

queryset = Post.objects.filter(is_toplevel=True, status=Post.ACTIVE)
queryset = queryset.annotate(views_count=Count("post_views_count"))
queryset = queryset.select_related('author')
queryset = queryset.select_related('category')
queryset = queryset.prefetch_related('tags')

И удалите свойство Post в models.py

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