Django + python: использовать порядок для объектов Django RawQuery?

У меня есть почти 100 миллионов наименований продуктов, присутствующих в БД. Каждый раз я отображаю 100 продуктов в пользовательском интерфейсе, а после прокрутки отображаются следующие 100 и так далее. Для этого я использовал Django RawQuery, так как моя база данных (mysql) не поддерживает отдельную функциональность.

Здесь «выборка» — это функция обратного вызова, используемая в другом файле:

    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, а затем начинал применять по возрастанию или по убыванию.

Так что в первый раз, когда он загружается, это займет некоторое время, но затем, применяя критерии сортировки, он не будет обращаться к базе данных, чтобы применять сортировку для каждого раза, когда сортировка выполняется.

В целом хочу сказать, повысить производительность в случае сортировки записей.


person Sandy    schedule 19.08.2016    source источник


Ответы (2)


Я думаю, что вы ищете разбиение на страницы. Это важный метод, когда вы хотите отображать данные в пакетах (страницах).

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...) в параметрах URL.

Пример GET http://localhost/products/?page=1

С точки зрения логики, ваш javascript должен отображать первую страницу и иметь счетчик, который содержит следующую страницу, которую вы должны запросить, после того, как пользователь прокрутит запрос AJAX, чтобы получить вторую страницу и увеличить счетчик страниц и т. д.

РЕДАКТИРОВАТЬ: Что касается сортировки, вы также можете использовать javascript для сортировки ваших данных.

person Kostas Pelelis    schedule 19.08.2016

Ниже моя попытка, и я получил желаемый ответ.

Я извлекаю данные из базы данных и сохраняю их в виде массива словарей в списке.

Предполагая формат хранения данных в списке:

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)
person Sandy    schedule 19.08.2016