簡體   English   中英

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

[英]my django query: how to improve the speed of list view

列表頁面是分頁的,只顯示 10 個期刊帖子。 盡管如此,仍有 95 個查詢正在執行。 它影響頁面加載速度。 而不是加載 <1 秒,它需要大約 4-5 秒。 這是我的代碼,請檢查並告訴我如何優化。 視圖.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM