如何更有效地进行django分页

时间:2012-03-04 07:54:23

标签: django pagination

我正在使用django默认分页,但我担心它的效率。我有3000多个对象存储在我的数据库中,我每页显示15个。所以每次我去下一页,我觉得我做的数据库查询再次在我的视图中。我在views.py中的代码就像Django的文档中给出的代码一样。这是我的代码:

all_words=Word.objects.all()
    user=request.user
    wordlist = []
    for word in all_words:
        taged_word = FlagWord.objects.filter(word = word,user = user)
        if taged_word :
            usertag = True
        else:
            usertag = False
        wordlist.append({'word':word,'usertag':usertag})
    number = Word.objects.count()
    paginator = Paginator(wordlist,15)
    try:
        page = int(request.GET.get('page','1'))
    except ValueError:
        page = 1

    try:
        listpage = paginator.page(page)
    except (EmptyPage,InvaildPage):
        listpage = paginator.page(paginator.num_pages)
    return render_to_response('GRETemplate/wordbank.html',{'words':listpage,'user':user,'number':number})

就像我第一次准备好我的单词列表一样,但是当我请求另一页时,我必须一遍又一遍地执行它。是否有更有效的方法来执行此操作?

Thanks.G

1 个答案:

答案 0 :(得分:1)

理想情况下,您应该缓存Word.objects.all()的结果,以便系统每次都不会点击您的数据库。

但是,我认为你的循环可以简化一点:

警告:我还没有测试过。

假设您的Word模型是:

class Word(models.Model):
   the_word = models.CharField(max_length=200)

首先,您将获得属于当前用户的所有标记的单词:

fw = FlagWord.objects.filter(user = user)
if fw.count():
    if fw.word_set.count():
      wordlist.append(
                   dict(('word':obj.the_word,'usertag':True)
                       for obj in fw.word_set.all())

最后,使用其他不匹配的单词过滤单词列表。我扩展了代码,因为它包含很多括号。

wordlist.append(dict(
                      ('word':obj.the_word,'usertag':False)
                      for obj in
                         Word.objects.exclude(
                           the_word__in=fw.values_list('word__the_word',flat=True)
                         )
                     )
               )