2013-12-23 2 views
3

입력에 4 개의 매개 변수를 확인하고 출력 결과를 나열하는 클래스를 작성했습니다. 이 매개 변수 중 하나만 필요하므로 7 개의 if - else 중첩 블록이 있습니다. 명시된 조건이 제대로 작동하도록 지정하고 싶습니다. 이 쓸 수있는 똑똑한 방법이 있다면python에서 if - else 블록이 너무 많이 발생하는 것을 피하는 방법

것은 내가 방황 :

if cd['subject'] is None: 
    if cd['school'] == '': 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name']) 
    else: 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school']) 
else: 
    if cd['school'] == '': 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], subject = cd['subject'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], subject = cd['subject']) 
    else: 
     if cd['price']: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], subject = cd['subject'], price = '0.0') 
     else: 
      files = File.objects.filter(name__contains=cd['name'], school = cd['school'], subject = cd['subject']) 
return render(request, 'search.html', {'files': files, 'request': request}) 
+0

코드 들여 쓰기를 수정하십시오. compulsion에'None', 빈 문자열'' ''및 부울 값 ('')을 왜 혼합하고 있습니까? – alko

+0

변수는 Django 폼에서 왔고 다른 폼 필드이기 때문에. 나는 똑같은 말을하는 더 똑똑한 (또는 좀 더 우아한) 방법이 있는지 궁금 해서요. – Higure

+0

매우 이상한'cd [ 'price']'취급 – alko

답변

6

내부적으로 함수에 전달할 키워드 인수는 단지 dict입니다. 그래서 직접 빌드하고 **name 구문을 사용하여 함수에 전달하십시오.

args = {} 

args['name__contains'] = cd['name'] 

if cd['subject'] is not None: 
    args['subject'] = cd['subject'] 
if cd['school'] != '': 
    args['school'] = cd['school'] 
if cd['price']: 
    args['price'] = cd['price'] 

files = File.objects.filter(**args) 
return render(request, 'search.html', {'files': files, 'request': request}) 
+0

if 문에 대한 코드가 OP – alko

+0

과 다르다. 약간의 조건을 조정하고 매력처럼 작동했습니다. – Higure

0

filter()에 전화의 키워드 인수와 딕셔너리를 구축 한 후 **kwargs 구문을 사용하여 전달합니다.

관련 문제