Как сделать Django-нумерацию более эффективно - PullRequest
0 голосов
/ 04 марта 2012

Я использую нумерацию страниц 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})

Как будто мой словарь готов в первый разно я должен делать это снова и снова, когда я запрашиваю другую страницу. Есть ли более эффективный способ сделать это?

Спасибо. G

1 Ответ

1 голос
/ 04 марта 2012

В идеале вы должны кешировать результаты 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)
                         )
                     )
               )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...