저는 항상 Django에서 여러 filter () 호출을 연결하는 것이 단일 호출로 수집하는 것과 항상 동일하다고 가정했습니다.
# Equivalent
Model.objects.filter(foo=1).filter(bar=2)
Model.objects.filter(foo=1,bar=2)
하지만 나는 이것이 사실이 아닌 내 코드에서 복잡한 쿼리 세트를 실행했습니다.
class Inventory(models.Model):
book = models.ForeignKey(Book)
class Profile(models.Model):
user = models.OneToOneField(auth.models.User)
vacation = models.BooleanField()
country = models.CharField(max_length=30)
# Not Equivalent!
Book.objects.filter(inventory__user__profile__vacation=False).filter(inventory__user__profile__country='BR')
Book.objects.filter(inventory__user__profile__vacation=False, inventory__user__profile__country='BR')
생성 된 SQL은
SELECT "library_book"."id", "library_book"."asin", "library_book"."added", "library_book"."updated" FROM "library_book" INNER JOIN "library_inventory" ON ("library_book"."id" = "library_inventory"."book_id") INNER JOIN "auth_user" ON ("library_inventory"."user_id" = "auth_user"."id") INNER JOIN "library_profile" ON ("auth_user"."id" = "library_profile"."user_id") INNER JOIN "library_inventory" T5 ON ("library_book"."id" = T5."book_id") INNER JOIN "auth_user" T6 ON (T5."user_id" = T6."id") INNER JOIN "library_profile" T7 ON (T6."id" = T7."user_id") WHERE ("library_profile"."vacation" = False AND T7."country" = BR )
SELECT "library_book"."id", "library_book"."asin", "library_book"."added", "library_book"."updated" FROM "library_book" INNER JOIN "library_inventory" ON ("library_book"."id" = "library_inventory"."book_id") INNER JOIN "auth_user" ON ("library_inventory"."user_id" = "auth_user"."id") INNER JOIN "library_profile" ON ("auth_user"."id" = "library_profile"."user_id") WHERE ("library_profile"."vacation" = False AND "library_profile"."country" = BR )
연결 filter()
호출 이있는 첫 번째 쿼리 세트 는 인벤토리 모델에 두 번 효과적으로 결합하여 두 조건 사이에 OR을 생성하는 반면 두 번째 쿼리 세트는 두 조건을 함께 AND로 만듭니다. 첫 번째 쿼리와 두 가지 조건이있을 것으로 예상했습니다. 이것이 예상되는 동작입니까 아니면 Django의 버그입니까?
관련 질문에 대한 답변 Django에서 ".filter (). filter (). filter () ..."사용에 대한 단점이 있습니까? 두 쿼리 세트가 동일해야 함을 나타냅니다.