2016-06-05 5 views
1

Ich habe gerade begonnen, hands-on auf Python-djangoPython - django: Mehrfachanfrage params Leseanfragen zur Herstellung

Ich versuche Filterobjekte aus DB-Abfragen in django-Ansicht. Drei Parameter werden von der URL übergeben und ich möchte eine 'oder' Bedingung für die Params machen. Wenige Parameter können null sein.

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}) 

Aber ich erhalte local variable 'files_id' referenced before assignment Fehler.

Antwort

0

Wenn 'custId' in request.GET and request.GET['custId'] falsch ist, dann wird files_id niemals definiert, aber Sie möchten unbedingt darauf verweisen. Daher müssen Sie vor der Bedingung einen Standardwert (z. B. set()) definieren, um sicherzustellen, dass sie immer definiert ist.

Ihr Code kann jedoch enorm vereinfacht werden:

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')) 
+0

Danke Alex Hall. Ich habe Ihren Vorschlag versucht, aber immer noch, wenn cust_id leer ist, erhalte ich 'set' Objekt hat kein Attribut 'Query' Fehler. Bitte beraten. –

+0

Ok, ich habe versucht, ein leeres Abfrage-Set wie unten zu schreiben und es hat funktioniert. Danke für Ihre vereinfachte Lösung. return LopFtsMLoanFilesMaster.objects.none() –