如何在Django中传递一个SQL子句的值列表

nnsrf1az  于 12个月前  发布在  Go
关注(0)|答案(2)|浏览(90)

我需要在我正在编写的Django应用程序中使用原始SQL查询。SQL查询在where语句中包含in子句:

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子句使用params。

polhcujo

polhcujo1#

根据raw()上的Django文档,
params是一个参数列表或字典。您将在查询字符串中使用%s占位符来表示列表..
方便的是,在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])。

smtd7mpg

smtd7mpg2#

尝试使用这种方式来查询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)

相关问题