我在DB中有近1亿个产品名称。我每次都会在UI中显示100个产品。滚动后显示下一个100&等等。为此,我使用了Django RawQuery,因为我的数据库(mysql)不支持不同的功能。
在这里' 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对象中,然后将开始应用升序或降序。
因此,当它第一次加载时,它需要一些时间,但随后应用排序标准,它不会进入数据库,以便在每次排序时应用排序。
总体上想要在分类记录的情况下提高性能。
答案 0 :(得分:1)
我认为你要找的是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
每当您提出请求时,您应该在网址参数中包含您要显示的页面(例如1,2,3 ...)。
在逻辑方面,你的javascript应显示第一页并有一个计数器,用于保存你应该请求的下一页,用户滚动后发出AJAX请求以获取第二页并增加页面计数器等。
编辑:至于排序问题,您还可以使用javascript对数据进行排序
答案 1 :(得分:0)
以下是我的尝试&我得到了理想的答案。
我从数据库获取数据&以列表数组的形式存储在列表中。
假设数据存储在列表中:
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)