我在我的网站上到处都使用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();
Run Code Online (Sandbox Code Playgroud)
我在Django ORM中使用pagintation的方式:
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)
Run Code Online (Sandbox Code Playgroud)
这样,Django变得非常聪明,并 …
我有一个原始 SQL 查询,用于为 Django REST ListAPI 视图构建查询集。它大致如下(请原谅无意义的名称):
class MyView(ListAPIView):
serializer_class = MySerializer
paginate_by = 10
def get_queryset(self):
params = {
"uid": str(self.request.user.id),
"param": str(self.kwargs['param'])
}
query = 'SELECT f.id ' \
'FROM myapp_foo f, myapp_bar b ' \
'WHERE b.foo_id = f.id AND ' \
'b.param >= %(param)s AND ' \
'f.dt_tm >= NOW() AND ' \
'(SELECT COUNT(*) FROM myapp_baz z ' \
'WHERE z.user_id = %(uid)s AND ' \
'z.qux_id = f.qux_id) = 0 ' \
'ORDER BY …Run Code Online (Sandbox Code Playgroud)