Django - 使用原始查询并通过参数排序
Posted
技术标签:
【中文标题】Django - 使用原始查询并通过参数排序【英文标题】:Django - use raw query and order by with parameter 【发布时间】:2021-11-30 18:12:02 【问题描述】: data_list = Data.objects.raw(
'SELECT * FROM data_table ORDER BY %(order_col_name)s',
"order_col_name" : order_col_name)
我使用此代码但是..排序不起作用。 我认为原始函数不能传递排序列参数。 有人可以帮忙吗?
【问题讨论】:
不能用参数指定:列名、表名等应该在查询部分提到,而不是参数部分。这是不使用原始查询的(许多)原因之一,而是使用 Django ORM。 【参考方案1】:列名、表名等不能作为参数传递:参数是用来传值的。
您可以使用字符串插值,但这很不安全,因此您应该在之前检查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 调用时才应使用原始查询。
【讨论】:
谢谢!代码示例被简化只是为了提问,我使用这个查询来连接两个没有外键的表。如果没有原始查询,我找不到加入它们的解决方案。而加入后,我必须按某个列排序,所以我使用了......那么没有字符串插值的参数排序没有解决方案吗? @Shale:您能否提出一个新问题,您将模型的(相关部分)分享给 JOIN。 我写了新帖子!非常感谢***.com/questions/69536574/…以上是关于Django - 使用原始查询并通过参数排序的主要内容,如果未能解决你的问题,请参考以下文章
为啥通过 django QuerySet 进行查询比在 Django 中使用游标慢得多?