[英]my django query: how to improve the speed of list view
List page is paginated and displaying only 10 journal posts.列表页面是分页的,只显示 10 个期刊帖子。 Despite this, there are 95 queries being performed.尽管如此,仍有 95 个查询正在执行。 It's affecting the page load speed.它影响页面加载速度。 Instead of loading <1 second it's taking around 4-5 seconds.而不是加载 <1 秒,它需要大约 4-5 秒。 Here are my code, please check and let me know how to optimize.这是我的代码,请检查并告诉我如何优化。 views.py视图.py
class PostListView(LoginRequiredMixin,ListView):
model = Post
paginate_by = 10
def get_queryset(self):
qs = super(PostListView, self).get_queryset().filter(Q(
Q(language_id__in=self.request.user.native_language),
~Q(user_id__in=self.request.user.forbidden_user_list))).order_by('-created')
return qs
def get_context_data(self, **kwargs):
context = super(PostListView, self).get_context_data(**kwargs)
context['list_type'] = 'all'
models.py模型.py
class Post(models.Model):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=60)
text = models.TextField()
native_text = models.TextField(blank=True)
created = models.DateTimeField(default=timezone.now, db_index=True)
# updated = models.DateTimeField(auto_now=True)
# is_corrected = models.BooleanField(default=False)
users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='posts_liked',
blank=True)
language = models.ForeignKey('account.Language', on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.text
def get_absolute_url(self):
return reverse('post-detail', args=[str(self.id)])
@property
def get_correctors(self):
from account.models import Profile as User
result = list(set(User.objects.all().filter((Q(correctedrows__post_id=self.id) | Q(perfectrows__post_id=self.id) | Q(comment__post_id=self.id)))))
return result
In your get_queryset
method, you should try to use select_related and prefetch_related to get whatever you will use in your template.在您的get_queryset
方法中,您应该尝试使用select_related和prefetch_related来获取您将在模板中使用的任何内容。
For example, if in your template you are doing post.user.name
, that is going to cause an additional query.例如,如果在您的模板中您正在执行post.user.name
,这将导致额外的查询。 Try something like this:尝试这样的事情:
def get_queryset(self):
qs = super(PostListView, self).get_queryset().select_related('user', 'language'). prefetch_related('users_like').filter(Q(
Q(language_id__in=self.request.user.native_language),
~Q(user_id__in=self.request.user.forbidden_user_list))).order_by('-created')
return qs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.