Python - django:读取多个请求参数以进行查询

Python - django: Reading multiple request params for making queries

我刚刚开始动手 Python-django

我正在尝试使用 Django 视图中的查询从数据库中过滤对象。从 url 传递了三个参数,我想对参数执行 'or' 条件。少数参数可以为空。

 if 'custName' in request.GET :
        custName = request.GET['custName']
        if custName is not None and custName != '':
            files_name=LopFtsMLoanFilesMaster.objects.filter(customer_name__contains=custName)

 if 'custId' in request.GET and request.GET['custId']:
            custId = request.GET['custId']
            if custId is not None and custId != '':
                files_id=LopFtsMLoanFilesMaster.objects.filter(customer_id__containis=custId)

 if 'address' in request.GET and request.GET['address']:
            address= request.GET['address']
            if address is not None and address != '':
                files_address =LopFtsMLoanFilesMaster.objects.filter(original_address1__contains=address)

 files = files_name | files_id | files_address

 return render(request, 'file_enquiry.html',
                     {'results': files}) 

但是我收到 local variable 'files_id' referenced before assignment 错误。

如果 'custId' in request.GET and request.GET['custId'] 为假,则 files_id 永远不会被定义,但您想无条件地引用它。所以你必须在条件之前定义一个默认值(例如set())以确保它总是被定义。

不过您的代码可以大大简化:

def filtered(request_param, model_field):
    param_val = request.GET.get(request_param)  # returns None if request_param is not in request.GET
    if not param_val:  # if param_val in (None, '')
        return set()
    return LopFtsMLoanFilesMaster.objects.filter(**{model_field + '__contains': param_val})

files = (filtered('custName', 'customer_name') |
         filtered('custId', 'customer_id') |
         filtered('address', 'original_address'))