Python 如何使用原始sql在一个页面上处理多个搜索字段?

Python 如何使用原始sql在一个页面上处理多个搜索字段?,python,sql,django,rawsql,Python,Sql,Django,Rawsql,我现在有两个serach字段(计划添加更多字段),我只想在过滤对象时使用原始sql(我知道Django提供ORM,这使我的工作更轻松,但在我现在的工作中,我需要使用sql) 我知道如何在Django中使用ORM,如下所示: def my_view(request): value_one = request.GET.get("value_one", None) value_two = request.GET.get("value_two",

我现在有两个serach字段(计划添加更多字段),我只想在过滤对象时使用原始sql(我知道Django提供ORM,这使我的工作更轻松,但在我现在的工作中,我需要使用sql) 我知道如何在Django中使用ORM,如下所示:

def my_view(request):
    value_one = request.GET.get("value_one", None)
    value_two = request.GET.get("value_two", None)
    value_three = request.GET.get("value_three", None)

    objects = MyModel.objects.all()

    if value_one:
        objects = objects.filter(field_one=value_one)
    if value_two:
        objects = objects.filter(field_two=value_two)
    if value_three:
        objects = objects.filter(field_three=value_three)
但是有没有一种方法可以使用SQL而不是过滤

def profile(request):
    cursor = connection.cursor()    
    value_one = request.GET.get("searchage", None)
    value_two = request.GET.get("search", None)
    objects= cursor.execute('SELECT * from People p JOIN Jobs j on p.JobId = j.Id ')
    objects = dictfetchall(cursor)
    if value_one:
        objects = cursor.execute('SELECT * from People p JOIN Jobs j on p.JobId = j.Id WHERE p.Age = %s',[value_one] )
    if value_two:
        objects = ???
    return render(request,'personal.html', {'value1':value_one, 'value2':value_two, 'objects':objects})
我只有一个想法,就是要有这样的if子句

if value_one and value_two:
..
elif value_one and !value_two:
...
elif !value_one and value_two:

但是如果我有两个以上的搜索字段,那么写每一个子句都会变得困难和耗时。没有Django ORM还有别的办法吗?

您可以将所有需要的条件组合到一个sql语句中

SELECT * from People p 
JOIN Jobs j on p.JobId = j.Id 
where (p.Age = [value_one] or [value_one] is null)
and (p.birthdate = [value_two] or [value_two] is null)
and ...
因此,您不需要使用多个sql命令并检查值:

def profile(request):
    cursor = connection.cursor()    
    value_one = request.GET.get("searchage", None)
    value_two = request.GET.get("search", None)
    objects= cursor.execute(<query above>)
    objects = dictfetchall(cursor)
    return render(request,'personal.html', {'value1':value_one, 'value2':value_two, 'objects':objects})
def配置文件(请求):
cursor=connection.cursor()
value\u one=request.GET.GET(“searchage”,无)
value_two=request.GET.GET(“搜索”,无)
objects=cursor.execute()
objects=dictfetchall(游标)
返回呈现(请求,'personal.html',{'value1':值1,'value2':值2,'objects':objects})