2012-06-20 3 views
1

장고에 복잡한 검색 양식을 작성했습니다.objects.filter() 및 외래 키 NULL

class student(models.Model): 
    name = models.CharField(max_length=255) 
    school = models.ForeignKey('school', null=True, blank=True) 
class school(models.Model): 
    name = models.CharField(max_length=255) 

그래서 학생이 학교에 대한 FK를 사용

은 여기 내 예를 들어 모델이다. 선택 사항이어야하므로 null=Trueblank=True이 사용됩니다.

<input type="text" name="school_name"/> 

그리고 나는이 (예)처럼 데이터베이스를 조회 할 : 나는 특정 학교 이름 학생들을 검색하려면이 같은 HTML 코드와 양식을 사용

def search(request): 
results = student.objects.filter(
    name__icontains=request.POST.get('student_name',''), 
    school__name__icontains=request.POST.get('school_name','') 
    ) 

문제는 다음과 같습니다 검색 양식을 비워두면 필터가 적용되지 않아 모든 학생이 표시됩니다. 모든 학생들이 학교를 결정하면 그게 효과가 있습니다. 학생이 학교가없는 경우, MySQL의 값은 'NULL'입니다. 빈 문자열이 NULL이 아니기 때문에 그 문자열을 찾을 수 없다고 가정합니다. 그러나 나는 그것을 어떻게 피할 수 있습니까? 모든 필터 식 앞에 if 문을 써야합니까? 우리는 필터링 할 50-100 개의 필드에 대해 이야기합니다!

나는 이것을 해결하기위한 모든 힌트에 감사 할 것입니다.

답변

2

이처럼 쓸 수있다 : 다른 필드의

query = { 
    'name__icontains': request.POST.get('student_name',''), 
} 
school_name = request.POST.get('school_name', None) 
if school_name is not None: 
    query['school__name__icontains'] = school_name 
results = student.objects.filter(**query) 

와 유사합니다. 이것은 각 필드에 대해 하나의 if 문을 의미합니다. query의 키가 단순한 문자열이기 때문에이 작업을 동적으로 수행 할 수도 있습니다. 즉,이를 계산하여 필요할 때 query에 추가 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 비슷한 해결책이 여기에 있습니다. [링크] http://www.nomadjourney.com/2009/04/dynamic-django-queries-with-kwargs/ 예, 작동합니다. 하지만 그것은 많은 작업이므로 쉽게 할 수있는 뭔가를 기대하고 있습니다 :-) – Conrad

+0

또한 QuerySet 객체가 연결될 수 있음을 언급하고자합니다. 그래서 이것을 쓰는 또 다른 방법은'results = student.objects.filter (FOO) '라고 말하면서 뭔가를 테스트하고'results = results.filter (BAR)'라고 말하면됩니다. 모든 조건부 비트가 모두 필터가 아닐 때 많은 도움이됩니다. 일부는 제한이나 다른 쿼리 방법으로 이어질 수 있습니다. – jdi