python - 我的 Django 查询 : how to improve the speed of list view

标签 python django performance optimization

列表页面已分页,仅显示 10 篇期刊文章。尽管如此,仍有 95 个查询正在执行。它影响页面加载速度。加载时间不是 <1 秒,而是大约 4-5 秒。 这是我的代码,请检查并让我知道如何优化。 View .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'

模型.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

最佳答案

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

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

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

关于python - 我的 Django 查询 : how to improve the speed of list view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58972074/

相关文章:

python - "undo"numpy.delete, numpy.insert?

python - 寻找有条件的顺序模式

python - 从磁盘中删除外键上的图像

python - 在 Python 中安装包时出现异常

c++ - 在 vector 的每个结构元素中重置值的最快方法?

python - Python子进程,在定时延迟后终止进程

css - 我不能使用 django 模板标签换行符和证明

python - Django 显示静态文件夹之外的图像/视频

java - 将字符串作为变量与字符连接与与其他字符串连接有什么区别?

javascript - 使用 .html() 更新后,浏览器对于新行数的响应速度较慢。你能帮我看看我的错误吗?