首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的django查询:如何提高列表视图的速度

我的django查询:如何提高列表视图的速度
EN

Stack Overflow用户
提问于 2019-11-21 17:58:23
回答 1查看 336关注 0票数 1

列表页面是分页的,只显示10个期刊帖子。尽管如此,仍有95个查询正在执行。这会影响页面加载速度。而不是加载<1秒,它需要大约4-5秒。这是我的代码,请检查并让我知道如何优化。views.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 19:03:28

在您的get_queryset方法中,您应该尝试使用select_relatedprefetch_related来获取将在模板中使用的内容。

例如,如果在您的模板中执行post.user.name,这将导致额外的查询。尝试如下所示:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58972074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档