Her zaman Django'da çoklu filtre () çağrılarını zincirlemenin her zaman onları tek bir çağrıda toplamakla aynı olduğunu varsaydım.
# Equivalent
Model.objects.filter(foo=1).filter(bar=2)
Model.objects.filter(foo=1,bar=2)
ancak kodumda durumun böyle olmadığı karmaşık bir sorgu kümesiyle karşılaştım
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')
Oluşturulan 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 )
Zincirleme filter()
çağrılara sahip ilk sorgu kümesi , Envanter modelini iki kez etkili bir şekilde birleştirerek iki koşul arasında bir VEYA oluştururken, ikinci sorgu kümesi iki koşulu birlikte VE oluşturur. İlk sorgunun da VE iki koşulu olacağını bekliyordum. Bu beklenen davranış mı yoksa bu Django'da bir hata mı?
İlgili sorunun cevabı Django'da ".filter (). Filter (). Filter () ..." kullanmanın bir dezavantajı var mı? Görünüşe göre iki sorgu kümesinin eşdeğer olması gerektiği belirtiliyor.