лучший способ поддержки динамического имени столбца и направления сортировки с помощью peewee python

#python #orm #peewee #dynamicquery

#python #orm #peewee #динамический запрос

Вопрос:

Пока у меня есть что-то вроде этого:

 page_nr = request.query.page_nr
how_many = request.query.how_many
sort_direction = request.query.sort_direction
sort_column = request.query.sort_column

error_urls = Url.select().where((Url.crawl == crawl_id)) 
            .order_by(Url.total_time.desc()) 
            .paginate(int(page_nr), int(how_many)) 
            .dicts()
  

Как вы можете видеть, я не использую sort_direction и sort_column .
Я попробовал запрос ниже, но он не сработал.

 error_urls = Url.select().where((Url.crawl == crawl_id) amp; (Url.utype == 'internal')) 
            .order_by(SQL(sort_column).sort_direction()) 
            .paginate(int(page_nr), int(how_many)) 
            .dicts()

(500, 'Internal Server Error', AttributeError("'SQL' object has no attribute 'sort_direction'",), 'Traceback (most recent call last):n  File "/usr/local/lib/python3.5/dist-packages/bottle.py", line 862, in _handlen    return route.call(**args)n  File "/usr/local/lib/python3.5/dist-packages/bottle.py", line 1732, in wrappern    rv = callback(*a, **ka)n  File "index.py", line 55, in _enable_corsn    return fn(*args, **kwargs)n  File "index.py", line 383, in get_performancen    .order_by(SQL(sort_column).sort_direction()) \nAttributeError: 'SQL' object has no attribute 'sort_direction'n')
  

Конечно, поскольку sort_direction, похоже, не оценивается.

Каков наилучший способ добиться динамического sort_column и sort_direction с помощью peewee orm? Желательно без написания необработанного запроса, если это возможно.

Спасибо

Ответ №1:

 sort_direction = request.query.sort_direction
sort_column = request.query.sort_column

error_urls = Url.select().where((Url.crawl == crawl_id)) 
            .order_by(Url.total_time.desc()) 
            .paginate(int(page_nr), int(how_many)) 
            .dicts()

if sort_column not in Url._meta.fields:
    raise Exception('unknown sort column')

field = getattr(Url, sort_column)
if sort_direction != 'ASC':
    field = field.desc()
error_urls = error_urls.order_by(field)