Django + python:使用Order by到Django RawQuery对象?

时间:2016-08-19 10:20:48

标签: python django sorting django-orm

我在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对象中,然后将开始应用升序或降序。

因此,当它第一次加载时,它需要一些时间,但随后应用排序标准,它不会进入数据库,以便在每次排序时应用排序。

总体上想要在分类记录的情况下提高性能。

2 个答案:

答案 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 ...)。

  

示例GET http://localhost/products/?page=1

在逻辑方面,你的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)