장고에 복잡한 검색 양식을 작성했습니다.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=True
및 blank=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 개의 필드에 대해 이야기합니다!
나는 이것을 해결하기위한 모든 힌트에 감사 할 것입니다.
답변 해 주셔서 감사합니다. 비슷한 해결책이 여기에 있습니다. [링크] http://www.nomadjourney.com/2009/04/dynamic-django-queries-with-kwargs/ 예, 작동합니다. 하지만 그것은 많은 작업이므로 쉽게 할 수있는 뭔가를 기대하고 있습니다 :-) – Conrad
또한 QuerySet 객체가 연결될 수 있음을 언급하고자합니다. 그래서 이것을 쓰는 또 다른 방법은'results = student.objects.filter (FOO) '라고 말하면서 뭔가를 테스트하고'results = results.filter (BAR)'라고 말하면됩니다. 모든 조건부 비트가 모두 필터가 아닐 때 많은 도움이됩니다. 일부는 제한이나 다른 쿼리 방법으로 이어질 수 있습니다. – jdi