我在我的网站上到处都是使用Django Paginator,甚至写了一个特殊的模板标签,以使它更方便。但是现在我到了一个状态,在那里我需要制作一个复杂的自定义原始SQL查询,没有LIMIT
就会返回大约100K条记录。Django:Paginator +原始SQL查询
如何在自定义查询中使用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();
我用pagintation 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中,你不应该只在你的Person类中使用空格。 – Gereltod 2017-05-25 04:16:47