2012-03-04 5 views
0

私はdjangoのデフォルトのページネーションを使用していますが、私はその効率について懸念しています。私は3000+オブジェクトをデータベースに保存していて、15ページずつ表示しています。より効率的に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}) 

私は私のワードリストを持っているようにです:私のコードであるだけDjango.Hereのドキュメントに与えられたコードのようなものです私はviews.pyで私views.Myコードで再びデータベースのクエリを実行しているように思えます初めての準備はできましたが、別のページをリクエストするときに何度も何度もやり直さなければなりません。これを行うための効率的な方法はありますか?

システムがあなたのデシベル毎回に当たらないようにするには理想的Word.objects.all()の結果をキャッシュする必要がありThanks.G

答えて

1

しかし、私はあなたのループは少し単純化することができると思います:

警告:私はそれをテストしていません。

あなたのワードモデルがあるとします

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()) 

最後に、他の言葉で単語リストをフィルタリング:

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

まず、あなたは現在のユーザーに属するすべてのフラグが付けられた単語を取得それは一致しませんでした。大括弧が含まれているので、コードを拡張しました。

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

どのようにループをmimeと比較しますか?それはall_wordsのための 'のための単語ですか: taged_word = FlagWord.objects.filter(word = word、user = user)'広範な部分ですか?結果をキャッシュする方法も? – Gnijuohz

+0

ループは、テーブルの各単語を、FlagWordのリンクされたオブジェクトに対して、DBからフェッチすることによってチェックします。 Mineはその逆を行い、リンクされたFlagWordsを持つ単語だけを検索し、SQLレベルで他の単語をフィルタリングします。 キャッシングについては、[キャッシングのドキュメント](https://docs.djangoproject.com/en/dev/topics/cache/)を参照してください。あなたはおそらく[ビューキャッシュごと](https://docs.djangoproject.com/en/dev/topics/cache/#the-perview-cache) –

+0

haha​​を使用したいと思うでしょう。少し)、スピードがたくさん断食されていることがわかりました!うわー、アルゴリズムは本当に重要です。 – Gnijuohz

関連する問題