Объединение нескольких вызовов filter () в Django, является ли это ошибкой?

Я всегда предполагал, что объединение нескольких filter () вызовы в Django всегда были такими же, как их сбор за один вызов.

# 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 () дважды объединяют модель инвентаризации, эффективно создавая ИЛИ между двумя условиями, тогда как второй набор запросов объединяет два условия вместе. Я ожидал, что первый запрос также И два условия. ожидаемое поведение или это ошибка в Django?

Ответ на связанный вопрос Есть ли обратная сторона использования ".filter (). filter (). filter () ..." в Django? указывает на то, что два набора запросов должны быть эквивалентны.

83
задан Community 23 May 2017 в 11:54
поделиться