Tôi luôn cho rằng việc xâu chuỗi nhiều lệnh gọi filter () trong Django luôn giống như việc thu thập chúng trong một lệnh gọi.
# Equivalent
Model.objects.filter(foo=1).filter(bar=2)
Model.objects.filter(foo=1,bar=2)
nhưng tôi đã gặp phải một bộ truy vấn phức tạp trong mã của mình, nơi đây không phải là trường hợp
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 được tạo là
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 )
Bộ truy vấn đầu tiên với các filter()
lệnh gọi chuỗi tham gia mô hình Khoảng không quảng cáo hai lần một cách hiệu quả tạo OR giữa hai điều kiện trong khi bộ truy vấn thứ hai AND kết hợp hai điều kiện với nhau. Tôi đã mong đợi rằng truy vấn đầu tiên cũng sẽ VÀ hai điều kiện. Đây có phải là hành vi được mong đợi hay đây là một lỗi trong Django?
Câu trả lời cho câu hỏi liên quan Có nhược điểm khi sử dụng ".filter (). Filter (). Filter () ..." trong Django không? dường như chỉ ra rằng hai bộ truy vấn phải tương đương nhau.