Tôi đang sử dụng Django Paginator ở khắp mọi nơi trên trang web của tôi và thậm chí đã viết một thẻ mẫu đặc biệt, để làm cho nó thuận tiện hơn. Nhưng bây giờ tôi đã đến một trạng thái, nơi mà tôi cần phải thực hiện một truy vấn SQL thô tùy chỉnh phức tạp, mà không cần LIMIT
sẽ trả về khoảng 100K bản ghi.Django: Paginator + truy vấn SQL thô
Tôi làm cách nào để sử dụng Django Pagintor với truy vấn tùy chỉnh?
dụ đơn giản của vấn đề của tôi:
mô hình của tôi:
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();
Con đường tôi sử dụng pagintation với 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)
Bằng cách này, Django nhận được rất thông minh, và thêm LIMIT
vào truy vấn khi thực thi nó. Nhưng khi tôi sử dụng trình quản lý tùy chỉnh:
all_objects = Person.objects.complicated_list();
tất cả dữ liệu được chọn và chỉ sau đó danh sách python được cắt lát, rất chậm. Làm cách nào để tôi làm cho trình quản lý tùy chỉnh của mình hoạt động tương tự như được tích hợp sẵn?
Trong Python, bạn không nên sử dụng khoảng trắng bất cứ khi nào bạn muốn trong lớp Person của bạn. – Gereltod