简体   繁体   English

我的 django 查询:如何提高列表查看速度

[英]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_relatedprefetch_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM