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

时间:2014-05-27 10:54:55

标签: database django django-orm

我需要在我正在编写的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条款中使用参数。

2 个答案:

答案 0 :(得分:7)

根据Django docs on raw()

  

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更改为元组(否则它将显示为&#34; IN [1,2,3] &#34;)并更改您的params输入到列表(params=[my_list, my_status])。

答案 1 :(得分:-1)

以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)