2016-11-23 1 views
2

다른 모델의 역 참조없이 테이블의 모든 개체를 쿼리하려고합니다. 어떤 B 객체로부터 참조 모든 A 객체를 얻기 위하여Django 백 워드 필터링

class A(models.Model): 
    pass 

class B(models.Model): 
    reference = models.ForeignKey(A) 

, 난 전혀 역 참조를 언급하지 않습니다 Django documentation on isnull

A.objects.filter(b__isnull=True) 

을한다.

문제가 생길 수 있습니까? 아니면 제대로 문서화되지 않았습니까?

+1

나는 그것이 작동하지 않는 이유를 생각할 수 없다. [이 질문] (http://stackoverflow.com/q/21405658/1324033) 그것이 옳은 제안 인 것 같다. – Sayse

답변

2

동일한 코드 예제를 사용하여 Django 1.10.3에서이 작업을 시도했습니다.

>>> print(A.objects.filter(b__isnull=True).query) 
SELECT "backrefs_a"."id" FROM "backrefs_a" LEFT OUTER JOIN "backrefs_b" ON ("backrefs_a"."id" = "backrefs_b"."reference_id") WHERE "backrefs_b"."id" IS NULL 

는 기술적으로,이 장고가 데이터베이스에 보내드립니다 동일한 SQL 아니지만, 그것은 충분히 가까이 :

은의 장고가 생성하는 원시 SQL 문에서 살펴 보자. 우리가 위로 조금 예쁜 쿼리가 실제로는 매우 안전하다는 것을 볼 수 있다면 더 설명은 https://stackoverflow.com/a/1074224/5044893

다음을 참조하십시오 LEFT OUTER JOIN

SELECT "backrefs_a"."id" 
FROM "backrefs_a" 
LEFT OUTER JOIN "backrefs_b" ON ("backrefs_a"."id" = "backrefs_b"."reference_id") 
WHERE "backrefs_b"."id" IS NULL 

LEFT 당신이에서 레코드를 얻을 것이다 보장, B에서 일치하는 레코드가없는 경우에도 Django는 NULLid으로 B를 저장하지 않으므로 예상대로 작동합니다.