Django - использование необработанного запроса и упорядочивание по параметру

    data_list = Data.objects.raw(
                    'SELECT * FROM data_table ORDER BY %(order_col_name)s',
                    {"order_col_name" : order_col_name})
                    

Я использую этот код, но... Упорядочение не работает. Я думаю, что функция raw не может передать параметр столбца упорядочивания. Кто-нибудь может помочь?

Имена столбцов, таблиц и т.д. не могут быть переданы в качестве параметра: параметры используются для передачи значений.

Вы можете работать со строковой интерполяцией, но это довольно небезопасно, поэтому перед этим необходимо проверить, является ли order_col_name именем колонки, поскольку строковая интерполяция чувствительна к SQL-инъекциям:

if 'order_col_name' in ('acceptable', 'column', 'names'):
    data_list = Data.objects.raw(
        f'SELECT * FROM data_table ORDER BY {order_col_name}'
    )
    # …
# …

Но это одна из (многих) причин, почему использование Django ORM лучше, чем выполнение необработанных запросов. Обычно необработанные запросы следует использовать только в том случае, если запрос не может быть превращен в вызов Django ORM (эффективно).

Вернуться на верх