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

How to handle several search fields on one page using raw sql?

我现在有两个 serach 字段(计划添加更多)并且我只想使用原始 sql whem 过滤对象(我知道 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:

但是如果我有 2 个以上的搜索字段,那么编写每个子句就会变得有点困难和耗时。如果没有 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})