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:如何编写查询以使用多列进行排序,通过模板显示

Django:如何编写查询以使用多列进行排序,通过模板显示

为啥通过 django QuerySet 进行查询比在 Django 中使用游标慢得多?

使用原始 SQL 查询生成表,并希望在 Django 中将这些表用作 ORM

[Django] 查看orm自己主动运行的原始查询sql

Laravel 原始 SQL 查询,具有多次出现的命名绑定