Skip to content
On this page

역참조 ForeignKey isnull 필터링

Reverse ForeignKey Field isnull

Django ORM에서 역참조 모델에 filter로 Model.objects.filter(reverse_table1__reverse_table2__field__isnull=True) 같이 역참조 필드에 isnull을 걸 경우, 실제 쿼리는 LEFT OUTER JOIN reverse_table1LEFT OUTER JOIN reverse_table2가 걸린다.
이렇게 되면 reverse_table1table2null이어도 값이 나오는 문제가 발생한다.

따라서 다음과 같이 ID NULL 체크를 해줘야 한다.

Model.objects.filter(
reverse_table1__reverse_table2__isnull=False,
reverse_table1__reverse_table2__field__isnull=True
)

이 경우 쿼리는 LEFT OUTER JOIN reverse_table2 ... WHERE reverse_table2.id IS NOT NULL 로 생성이 되면서 reverse_table1table2null일 경우 필터링 되어 나오지 않는다.