Подтвердить что ты не робот

Сохранять порядок списка в разбивке по страницам в sql

У меня есть список с порядком вставки. Я хочу разбивать страницы по одному и тому же порядку. Как вы можете видеть, в настоящее время выход будет отличаться от порядка.

following_companies_list_data = Company.query.filter(Company.id.in_(['2', '24', '1', '7', '373'])).paginate(
            page, per_page=10, error_out=False)

companies = following_companies_list_data.items

for i in companies:
    print i.id

7
24
373
2
1

question

4b9b3361

Ответ 1

Решение, основанное на этом ответе от связанного вопроса

company_ids = ['2', '24', '1', '7', '373']
order_expressions = [(Company.id==i).desc() for i in company_ids]
query = Company.query.filter(Company.id.in_(company_ids)).order_by(*order_expressions)
following_companies_list_data = query.paginate(page, per_page=10, error_out=False)

Также вы можете использовать функцию idx из intarray module

from sqlalchemy import func
company_ids = ['2', '24', '1', '7', '373']
query = Company.query.filter(Company.id.in_(company_ids)).order_by(func.idx(company_ids, Company.id))
following_companies_list_data = query.paginate(page, per_page=10, error_out=False)

Ответ 2

Я думаю, что самый простой способ сделать это - разбивать список своих идентификаторов перед тем, как даже запросить:

company_ids_page = company_ids[page * 10:(page + 1) * 10]
q = Company.query.filter(Company.id.in_(company_ids_page))

Затем переупорядочивайте компании на основе ваших идентификаторов:

companies_map = {c.id: c for c in q}
companies = [companies_map[i] for i in company_ids_page]

Если вам нужны причудливые функции объектов Pagination, вы можете создать аналогичный класс для списков.