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)