【发布时间】:2011-02-01 17:07:10
【问题描述】:
我在我的网站上到处都在使用 Django Paginator,甚至写了一个特殊的模板标签,以使其更方便。但是现在我遇到了一个状态,我需要进行一个复杂的自定义原始 SQL 查询,如果没有 LIMIT 将返回大约 100K 记录。
如何将 Django Pagintor 与自定义查询一起使用?
我的问题的简化示例:
我的模特:
class PersonManager(models.Manager):
def complicated_list(self):
from django.db import connection
#Real query is much more complex
cursor.execute("""SELECT * FROM `myapp_person`""");
result_list = []
for row in cursor.fetchall():
result_list.append(row[0]);
return result_list
class Person(models.Model):
name = models.CharField(max_length=255);
surname = models.CharField(max_length=255);
age = models.IntegerField();
objects = PersonManager();
我在 Django ORM 中使用分页的方式:
all_objects = Person.objects.all();
paginator = Paginator(all_objects, 10);
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
persons = paginator.page(page)
except (EmptyPage, InvalidPage):
persons = paginator.page(paginator.num_pages)
这样,Django 变得非常聪明,并在执行查询时将LIMIT 添加到查询中。但是当我使用自定义管理器时:
all_objects = Person.objects.complicated_list();
选择所有数据,然后才切片python列表,这非常慢。如何让我的自定义管理器表现得像内置的一样?
【问题讨论】:
-
在 Python 中,您不应该在您的 Person 类中随时使用空格。
标签: python sql django pagination