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 (эффективно).