Django+python:对 Django RawQuery 对象使用 Order by?
Django+python: Use Order by to Django RawQuery objects?
我在 DB.I 中显示了近 1 亿个产品名称,我每次在 UI 中显示 100 个产品,滚动后显示下一个 100 个等等。为此,我使用了 Django RawQuery,因为我的数据库 (mysql) 不支持 distinct functionality.
这里'fetch'是其他文件中使用的回调函数:
def fetch(query_string, *query_args):
conn = connections['databaseName']
with conn.cursor() as cursor:
cursor.execute(query_string, query_args)
record = dictfetchall(cursor)
return record
这里是views.py中的主要调用
所以示例原始查询代码片段:
record= fetch("select productname from abc")
这里如果我要对记录应用排序标准
record= fetch("select productname from abc orderby name ASC")
降序也是如此。结果显示排序的产品需要很长时间。
我想要的是我将查询 1 次并将存储在 python 对象中,然后将开始应用升序或降序。
因此,第一次加载时,需要一些时间,但随后应用排序标准时,它不会进入数据库以在每次排序时应用排序。
总的来说想说在对记录进行排序的情况下提高性能。
我想你要找的是pagination。当您想要批量(页面)显示数据时,这是一项必不可少的技术。
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def listing(request):
query_string = 'your query'
query_args = []
conn = connections['databaseName']
with conn.cursor() as cursor:
cursor.execute(query_string, *query_args)
all_records = dictfetchall(cursor)
paginator = Paginator(all_records, 100) # Show 100 records per page
page = request.GET.get('page')
try:
records = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
records = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
records = paginator.page(paginator.num_pages)
return records
无论何时发出请求,都应在 url 参数中包含要显示的页面(例如 1,2,3...)。
Example GET http://localhost/products/?page=1
从逻辑上讲,您的 javascript 应该显示第一页并有一个计数器来保存您应该请求的下一页,在用户滚动后发出 AJAX 请求以获取第二页页面并增加页面计数器等...
编辑:至于排序问题,您还可以使用 javascript 对数据进行排序
以下是我的尝试,我得到了想要的答案。
我从数据库中获取数据,并以字典数组的形式存储在列表中。
假设列表中的数据存储格式:
l = [{'productName'='soap',id=1},{'productName'='Laptop',id=2}]
下面的代码片段是根据键排序的解决方案:
from operator import itemgetter
升序
res= sorted(l, key=itemgetter('name'))
降序
res= sorted(l, key=itemgetter('name'),reverse=True)
我在 DB.I 中显示了近 1 亿个产品名称,我每次在 UI 中显示 100 个产品,滚动后显示下一个 100 个等等。为此,我使用了 Django RawQuery,因为我的数据库 (mysql) 不支持 distinct functionality.
这里'fetch'是其他文件中使用的回调函数:
def fetch(query_string, *query_args):
conn = connections['databaseName']
with conn.cursor() as cursor:
cursor.execute(query_string, query_args)
record = dictfetchall(cursor)
return record
这里是views.py中的主要调用 所以示例原始查询代码片段:
record= fetch("select productname from abc")
这里如果我要对记录应用排序标准
record= fetch("select productname from abc orderby name ASC")
降序也是如此。结果显示排序的产品需要很长时间。
我想要的是我将查询 1 次并将存储在 python 对象中,然后将开始应用升序或降序。
因此,第一次加载时,需要一些时间,但随后应用排序标准时,它不会进入数据库以在每次排序时应用排序。
总的来说想说在对记录进行排序的情况下提高性能。
我想你要找的是pagination。当您想要批量(页面)显示数据时,这是一项必不可少的技术。
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def listing(request):
query_string = 'your query'
query_args = []
conn = connections['databaseName']
with conn.cursor() as cursor:
cursor.execute(query_string, *query_args)
all_records = dictfetchall(cursor)
paginator = Paginator(all_records, 100) # Show 100 records per page
page = request.GET.get('page')
try:
records = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
records = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
records = paginator.page(paginator.num_pages)
return records
无论何时发出请求,都应在 url 参数中包含要显示的页面(例如 1,2,3...)。
Example GET http://localhost/products/?page=1
从逻辑上讲,您的 javascript 应该显示第一页并有一个计数器来保存您应该请求的下一页,在用户滚动后发出 AJAX 请求以获取第二页页面并增加页面计数器等...
编辑:至于排序问题,您还可以使用 javascript 对数据进行排序
以下是我的尝试,我得到了想要的答案。
我从数据库中获取数据,并以字典数组的形式存储在列表中。
假设列表中的数据存储格式:
l = [{'productName'='soap',id=1},{'productName'='Laptop',id=2}]
下面的代码片段是根据键排序的解决方案:
from operator import itemgetter
升序
res= sorted(l, key=itemgetter('name'))
降序
res= sorted(l, key=itemgetter('name'),reverse=True)