【问题标题】:How to handle several search fields on one page using raw sql?如何使用原始 sql 处理一页上的多个搜索字段?
【发布时间】:2021-04-30 22:45:01
【问题描述】:

我现在有两个 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 还有其他出路吗?

【问题讨论】:

    标签: python sql django rawsql


    【解决方案1】:

    你可以将你想要的所有条件组合到一个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})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2011-08-11
      • 2019-01-26
      相关资源
      最近更新 更多