2012-03-04 78 views
0

我使用的是Django的默認分頁,但我很關心它的efficiency.I都存儲在我的數據庫3000+對象和我顯示15每page.So我每次去到下一個頁面在我看來,我在views.py我views.My代碼再做數據庫查詢就像在Django.Here的文檔中給出的代碼是我的代碼:怎麼做的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

理論上,應該緩存Word.objects.all()的結果,因此係統不會打你的數據庫每次。

不過,我覺得你的循環可以簡化一點:

警告:我沒有測試它。

假設你的話語模式是:

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) 
         ) 
        ) 
       ) 
+0

你怎麼比較你的啞劇循環?它是否是all_words中的詞: taged_word = FlagWord.objects.filter(word = word,user = user)'部分是否可擴展?還有如何緩存結果? – Gnijuohz 2012-03-04 09:19:51

+0

您的循環通過從數據庫中提取它來檢查表中的每個單詞與FlagWord中的鏈接對象。 Mine做相反的事情,它只搜索那些有任何鏈接的FlagWords的單詞,然後在SQL級別過濾其他單詞。 用於高速緩存,請參見[緩存文檔】(https://docs.djangoproject.com/en/dev/topics/cache/)。你可能會想[每視圖緩存](https://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache) – 2012-03-04 09:42:19

+0

哈哈。我用你的方法(只改變了一個小),並發現禁食的速度很快!哇,算法真的很重要。很多謝謝。 – Gnijuohz 2012-03-04 12:40:19