我正在使用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
答案 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)
)
)
)