我需要显示大量我不想分页的数据,因为我使用的是jQuery tablesorter,并且在视图中使用Person.objects.all()
对数据库来说非常昂贵。加载时间太长,所以我试图在我的视图中执行原始SQL。
我尝试使用Django的通用视图,但它们和objects.all()
方法一样慢。
这是我的模特。基本上,我希望在计算所有人的数量时,显示他们出现的次数,比如var1
或var2
。
class Person(models.Model):
name = models.CharField(max_length=64, blank=True, null=True)
last_name = models.CharField(max_length=64,)
slug = models.SlugField()
class Object(models.Model):
title = models.ForeignKey(Title)
number = models.CharField(max_length=20)
var1 = models.ManyToManyField(Person, related_name="var1_apps", blank=True, null=True)
var2 = models.ManyToManyField(Person, related_name="var2_apps", blank=True, null=True)
var3 = models.ManyToManyField(Person, related_name="var3_apps", blank=True, null=True)
# ...
slug = models.SlugField()
from django.db import connection
def test (request):
cursor = connection.cursor()
cursor.execute('SELECT * FROM objects_person')
persons = cursor.fetchall() # fetchall() may not be the right call here?
return render_to_response('test.html', {'persons':persons}, context_instance=RequestContext(request))
模板:
<table class="table tablesorter">
<thead>
<tr>
<th>Name</th>
<th>Var1</th>
<th>Var2</th>
<th>Var3</th>
</tr>
</thead>
<tbody>
{% for person in persons %}
<tr>
<td><a href="{{ person.get_absolute_url }}">{{ person.last_name }}{% if person.name %}, {{ person.name }}{% endif %}</a></td>
<td>{{ person.var1_apps.count }}</td>
<td>{{ person.var2_apps.count }}</td>
<td>{{ person.var3_apps.count }}</td>
</tr>
{% endfor %}
</tbody>
</table>
它做什么迭代空行,但如果我只是调用{{ creator }}
它将显示整个SQL表 - 我不想要。我必须对查询做错了,所以任何帮助都会受到赞赏。
答案 0 :(得分:3)
问题不在于Person.objects.all()
。当您遍历该查询集时,您正在对查询集中的每个项执行三次查询以计算计数。
答案是annotate您的查询集,其中包含每个字段的计数。
# in the view
persons = Person.objects.annotate(num_var1_apps=Count('var1_apps'),
num_var2_apps=Count('var2_apps'),
num_var3_apps=Count('var3_apps'),
)
# in the template
{% for person in persons %}
<tr>
<td><a href="{{ person.get_absolute_url }}">{{ person.last_name }}{% if person.name %}, {{ person.name }}{% endif %}</a></td>
<td>{{ person.num_var1_apps }}</td>
<td>{{ person.num_var2_apps }}</td>
<td>{{ person.num_var3_apps }}</td>
</tr>
{% end for %}