我在我的網站上到處都是使用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