data_list = Data.objects.raw(
'SELECT * FROM data_table ORDER BY %(order_col_name)s',
{"order_col_name" : order_col_name})
我使用此代码,但是..订购不起作用。 我认为原始函数无法传递排序列参数。 有人可以帮忙吗?
最佳答案
列、表等的名称不能作为参数传递:参数用于传递值。
您可以使用字符串插值,但这非常不安全,因此您应该在之前检查 order_col_name
是否是列名,因为字符串插值对 SQL 注入(inject)很敏感:
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 调用时才应使用原始查询。
关于Django - 使用原始查询和参数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69535591/