如何在 Django 中传递 `in` SQL 子句的值列表

问题描述 投票:0回答:2

我需要在我正在编写的 Django 应用程序中使用原始 SQL 查询。 SQL 查询在

in
语句中包含
where
子句:

select *
from abc_mymodel
where some_fk in (1,2,3)
and some_status = 'foo'

我非常支持将 SQL 参数作为参数传递。对于单值的来说,这很容易完成。但是,我不确定如何(或是否)对

in
子句执行此操作。理想情况下,我想做类似的事情:

sql = """
    select *
    from abc_mymodel
    where some_fk in %s
    and some_status = %s
"""
my_list = [1,2,3]
my_status = 'foo'
trinkets = MyModel.objects.raw(
    sql,
    params=(my_list, my_status)
)

我知道我可以使用字符串组合来编写

in
子句并使用 params 来表示其余值。但是,我很好奇是否也可以将参数用于
in
子句。

database django django-orm
2个回答
11
投票

根据 raw()

 上的 Django 文档,

params
是参数的列表或字典。您将在列表的查询字符串中使用
%s
占位符...此类 占位符将替换为 params 参数中的参数。

方便的是,在 django shell 中测试原始查询非常容易。如果您只需输入

raw()
查询,它将打印
RawQuerySet
以及结果查询:

>>> from django.contrib.auth.models import User
>>> pk_list = (1, 3, 6)
>>> User.objects.raw('SELECT * FROM auth_user WHERE id IN %s', params=[pk_list])
<RawQuerySet: 'SELECT * FROM auth_user WHERE id IN (1, 3, 6)'>

如您所见,

params
中的所有内容都会被放入原始查询中。在您的示例中,您需要将
my_list
更改为元组(否则它将看起来像“IN [1,2,3]”)并将
params
输入更改为列表 (
params=[my_list, my_status]
)。


0
投票

尝试这样进行 Django ORM 类型查询:

list = [1,2,3]
choices = Model.objects.filter(columnName__in=list)

您的情况:

list = [1,2,3]
choices = abc_mymodel.objects.filter(some_fk__in=list)
© www.soinside.com 2019 - 2024. All rights reserved.