Django - 使用原始查询和参数排序

标签 django model django-queryset

    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/

相关文章:

python - 当前路径 account/login/与其中任何一个都不匹配?

asp.net-mvc - 将带有字符串的 json 数组发布到 Asp.Net MVC Action Controller 始终为空

python - 查询集仅返回分配了外键的对象。Django

javascript - 向所有 Angular 模型添加子类

Django ORM 和 SQL 内连接

Django 查询多个日期中的最新日期

django - 如何将表单值传递给 Django View ?

python - 从 Django 原始查询集创建元组

python - 测试 Django Facebook 应用程序

ruby-on-rails - 仅在创建和更新时验证 Rails 模型