django,拆分查询参数并传递IN子句中的值

时间:2013-12-26 17:21:59

标签: python django postgresql

我在django中编写了一个本机sql查询,现在我需要在where子句中传递过滤条件。

我将URL作为值列表(如(a,b,c,d))传递,并且在数据库中我需要将它们与列进行比较并过滤数据。

示例网址:

(适用// 10.100.212.16:8000/test/&param1=a,b,c,d)

示例sql:

从测试中选择*,其中测试如(%a%)或类似(%b%)或类似(%c%)或类似(%d%)

如何使用本机sql在django中写这个。

我使用postgres作为db

感谢

1 个答案:

答案 0 :(得分:2)

根据提供的URL,但假设您使用正确的?字符而不是&来标记查询字符串的开头:

import operator
from django.db.models import Q
param1_raw_string = request.GET.get('param1')
if param1_raw_string:
    param1_values = param1_raw_string.split(',')
    tests = Test.objects.filter(reduce(operator.or_, (Q(test__contains=param1) for param1 in param1_values)))
else:
    # do something reasonable when param1 is missing

如果您想要不区分大小写的比较,请改用__icontains。使用Q撰写多个operator.or_个对象是重点。

如果您使用?param1=a&param1=b...,则可以跳过split,然后只需撰写param1_values = request.GET.getlist('param1')