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