मैंने हमेशा यह माना कि 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 में एक बग है?
संबंधित प्रश्न का उत्तर क्या Django में ".filter () फ़िल्टर () फ़िल्टर () ..." का उपयोग करने के लिए एक नकारात्मक पहलू है? संकेत दिया गया है कि दो क्वेरी समतुल्य होनी चाहिए।