আমি সর্বদা ধরে নিয়েছিলাম যে জ্যাঙ্গোতে একাধিক ফিল্টার () কল চেইন করা সর্বদা একক কলে তাদের সংগ্রহ করার মতো।
# 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')
উত্পাদিত এসকিউএল হ'ল
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 তৈরি করার জন্য ইনভেন্টরি মডেলে যোগ দেয় যেখানে দ্বিতীয় ক্যোয়ারসেট অ্যান্ডস দুটি শর্ত একসাথে করে। আমি আশা করছিলাম যে প্রথম ক্যোয়ারীটিও হবে এবং দুটি শর্তও। এটি কি প্রত্যাশিত আচরণ বা এটি জঙ্গোতে কোনও বাগ?
সম্পর্কিত প্রশ্নের উত্তর কি জাজানোতে ".filter ()। ফিল্টার ()। ফিল্টার () ..." ব্যবহার করার কোনও প্রতিকূলতা আছে? দুটি ক্যোয়ারেট সমান হওয়া উচিত বলে মনে হয়।