জ্যাঙ্গোতে একাধিক যুক্তি এবং চেইন ফিল্টার সহ ফিল্টারের মধ্যে পার্থক্য কী?
জ্যাঙ্গোতে একাধিক যুক্তি এবং চেইন ফিল্টার সহ ফিল্টারের মধ্যে পার্থক্য কী?
উত্তর:
আপনি উত্পন্ন এসকিউএল বিবৃতিতে দেখতে পাচ্ছেন পার্থক্যটি "OR" নয় কারণ কিছু লোক সন্দেহ করতে পারে। WHOE এবং JOIN কে এভাবে স্থাপন করা হয়।
উদাহরণ 1 (একই যোগদানের টেবিল): https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-mult- মূল্যবান- সম্পর্কিত সম্পর্কগুলি থেকে
Blog.objects.filter(
entry__headline__contains='Lennon',
entry__pub_date__year=2008)
এটি আপনাকে এমন সমস্ত ব্লগকে দেবে যা উভয়ের সাথে একটি করে প্রবেশ রয়েছে (entry__headline__contains='Lennon') AND (entry__pub_date__year=2008)
, যা আপনি এই কোয়েরি থেকে আশা করতে পারেন।
ফলাফল:
Blog with {entry.headline: 'Life of Lennon', entry.pub_date: '2008'}
উদাহরণ 2 (শৃঙ্খলিত)
Blog.objects.filter(
entry__headline__contains='Lennon'
).filter(
entry__pub_date__year=2008)
এটি উদাহরণ 1 থেকে সমস্ত ফলাফল কভার করবে, তবে এটি কিছুটা আরও ফলাফল উত্পন্ন করবে। কারণ এটি প্রথমে সমস্ত ব্লগ (entry__headline__contains='Lennon')
এবং তারপরে ফলাফল ফিল্টারগুলি থেকে ফিল্টার করে (entry__pub_date__year=2008)
।
পার্থক্যটি হ'ল এটি আপনাকে এর মতো ফলাফলও দেবে:
একাধিক এন্ট্রি সহ একটি ব্লগ
{entry.headline: '**Lennon**', entry.pub_date: 2000},
{entry.headline: 'Bill', entry.pub_date: **2008**}
প্রথম ফিল্টারটি যখন মূল্যায়ন করা হয় তখন প্রথম এন্ট্রির কারণে বইটি অন্তর্ভুক্ত করা হয় (যদিও এর সাথে অন্যান্য মিল রয়েছে যা মিলছে না)। দ্বিতীয় ফিল্টারটি যখন মূল্যায়ন করা হয় তখন দ্বিতীয় প্রবেশের কারণে বইটি অন্তর্ভুক্ত থাকে।
একটি সারণী: তবে যদি ক্যোয়ারিতে ইউজি এবং ডিটিংয়ের উদাহরণের মতো যুক্ত টেবিলগুলি জড়িত না। ফলাফল একই।
(entry__headline__contains='Lennon')
এবং তারপরে ফলাফল ফিল্টারগুলি (entry__pub_date__year=2008)
" যদি "তারপর ফলাফল থেকে" সঠিক হয় তবে কেন এটির সাথে কিছু অন্তর্ভুক্ত করা হবে entry.headline == 'Bill'
.. .একটি entry__headline__contains='Lennon'
ফিল্টার করা যাবে না Bill
?
যে ক্ষেত্রে "একাধিক আর্গুমেন্ট ফিল্টার-ক্যোয়ারী" এর ফলাফলগুলি "চেইনযুক্ত-ফিল্টার-ক্যোয়ারী" এর চেয়ে পৃথক, নিম্নলিখিত:
রেফারেন্সিং অবজেক্ট এবং সম্পর্কের ভিত্তিতে রেফারেন্স করা অবজেক্টগুলি নির্বাচন করা এক থেকে অনেকগুলি (বা অনেকগুলি থেকে বহু)।
একাধিক ফিল্টার:
Referenced.filter(referencing1_a=x, referencing1_b=y) # same referencing model ^^ ^^
শৃঙ্খলিত ফিল্টারগুলি:
Referenced.filter(referencing1_a=x).filter(referencing1_b=y)
উভয় প্রশ্নেরই আলাদা ফলাফল আউটপুট করা যায়:
আরও বেশি হলে রেফারেন্সিং-মডেলের একটি সারি রেফারেন্স-মডেলটিতেReferencing1
একই সারিতে উল্লেখ করতে পারেReferenced
। এটির ক্ষেত্রে এটি হতে পারেReferenced
:Referencing1
হয় 1: N (একের অনেকের) বা N: M (অনেকের কাছে অনেকের) সম্পর্ক-জাহাজ।
উদাহরণ:
আমার অ্যাপ্লিকেশনটি my_company
দুটি মডেল Employee
এবং বিবেচনা করুন Dependent
। একজন কর্মী my_company
নির্ভরশীলদের চেয়ে বেশি থাকতে পারে (অন্য কথায় নির্ভরশীল কোনও একক কর্মচারীর পুত্র / কন্যা হতে পারে, অন্যদিকে একজন কর্মীর একাধিক পুত্র / কন্যা থাকতে পারে)।
এহ, স্বামী-স্ত্রীর মত ধরে দুজনেই এ-তে কাজ করতে পারে না my_company
। আমি 1: মি উদাহরণ নিলাম
সুতরাং, Employee
রেফারেন্স-মডেল যা আরও উল্লেখ করা যেতে পারে Dependent
যে পরে রেফারেন্সিং-মডেল। নিম্নলিখিত হিসাবে এখন সম্পর্ক-রাষ্ট্র বিবেচনা করুন:
Employee: Dependent: +------+ +------+--------+-------------+--------------+ | name | | name | E-name | school_mark | college_mark | +------+ +------+--------+-------------+--------------+ | A | | a1 | A | 79 | 81 | | B | | b1 | B | 80 | 60 | +------+ | b2 | B | 68 | 86 | +------+--------+-------------+--------------+
নির্ভরশীল
a1
কর্মচারীA
, এবং কর্মচারীর উপর নির্ভরশীলb1, b2
উল্লেখ উল্লেখ করেB
।
এখন আমার জিজ্ঞাসাটি হ'ল:
কলেজ / বিদ্যালয় উভয় ক্ষেত্রেই ছেলের / কন্যা সন্তানের স্বতন্ত্র চিহ্ন রয়েছে (যা> = 75%) রয়েছে এমন সমস্ত কর্মচারীর সন্ধান করুন?
>>> Employee.objects.filter(dependent__school_mark__gte=75,
... dependent__college_mark__gte=75)
[<Employee: A>]
আউটপুটটি 'এ' নির্ভরশীল 'এ 1' উভয় কলেজেই স্বতন্ত্র চিহ্ন রয়েছে এবং স্কুল কর্মচারী 'এ' এর উপর নির্ভরশীল। দ্রষ্টব্য 'বি' নির্বাচন করা হয়নি কারণ 'বি'-এর সন্তানের নেট এবং কলেজ উভয়ই আলাদা আলাদা চিহ্ন রয়েছে। সম্পর্কিত বীজগণিত:
কর্মচারী school (স্কুল_মার্ক> = 75 এবং কলেজ_মার্ক> = 75) নির্ভর
দ্বিতীয়ত, আমার যদি একটি প্রশ্নের প্রয়োজন হয়:
এমন কিছু কর্মচারী সন্ধান করুন যাদের কিছু নির্ভরশীলদের কলেজ এবং স্কুলে স্বতন্ত্র চিহ্ন রয়েছে?
>>> Employee.objects.filter(
... dependent__school_mark__gte=75
... ).filter(
... dependent__college_mark__gte=75)
[<Employee: A>, <Employee: B>]
এবার 'বি' বেছে নিয়েছে কারণ 'বি' এর দুটি সন্তান রয়েছে (একের বেশি!), একটিতে 'বি 1' বিদ্যালয়ের স্বতন্ত্র চিহ্ন রয়েছে এবং অন্যটি কলেজের 'বি 2' তে স্বতন্ত্র চিহ্ন রয়েছে।
ফিল্টার অর্ডার কিছু যায় আসে না আমরা উপরের ক্যোয়ারীটিও এইভাবে লিখতে পারি:
>>> Employee.objects.filter(
... dependent__college_mark__gte=75
... ).filter(
... dependent__school_mark__gte=75)
[<Employee: A>, <Employee: B>]
ফলাফল একই! সম্পর্কিত বীজগণিত হতে পারে:
(কর্মচারী school (স্কুল_মার্ক> = 75) নির্ভরশীল) ⋈ ( কলেজ_মার্ক > = 75) নির্ভর
নোট নিম্নলিখিত:
dq1 = Dependent.objects.filter(college_mark__gte=75, school_mark__gte=75)
dq2 = Dependent.objects.filter(college_mark__gte=75).filter(school_mark__gte=75)
ফলাফল একই ফলাফল: [<Dependent: a1>]
আমি ব্যবহার করে জ্যাঙ্গো দ্বারা উত্পাদিত লক্ষ্য এসকিউএল কোয়েরিটি পরীক্ষা করে দেখি print qd1.query
এবং print qd2.query
উভয়ই একই (জাজানো ১.))।
তবে শব্দার্থকভাবে দু'টিই আমার কাছে আলাদা । প্রথমটি সাধারণ বিভাগের মতো দেখায় σ [স্কুল_মার্ক> = 75 এবং কলেজ_মার্ক> = 75] (নির্ভরশীল) এবং দ্বিতীয়টি ধীরে ধীরে নেস্টেড ক্যোয়ারির মতো: σ [স্কুল_মার্ক> = 75] ( college [কলেজ_মার্ক > = 75] (নির্ভরশীল))।
যদি কোড @ কোডেপ্যাডের প্রয়োজন হয়
বিটিডব্লিউ, এটি ডকুমেন্টেশনে দেওয়া হয়েছে @ বহু-মূল্যবান সম্পর্কের বিস্তৃতি আমি মাত্র একটি উদাহরণ যুক্ত করেছি, আমি মনে করি এটি নতুন কারও পক্ষে সহায়ক হবে।
বেশিরভাগ সময়, কোনও প্রশ্নের জন্য ফলাফলগুলির একমাত্র সম্ভাব্য সেট রয়েছে।
চেইন ফিল্টারগুলির ব্যবহার যখন আপনি এম 2 মি নিয়ে কাজ করছেন তখন আসে:
এই বিবেচনা:
# will return all Model with m2m field 1
Model.objects.filter(m2m_field=1)
# will return Model with both 1 AND 2
Model.objects.filter(m2m_field=1).filter(m2m_field=2)
# this will NOT work
Model.objects.filter(Q(m2m_field=1) & Q(m2m_field=2))
অন্যান্য উদাহরণ স্বাগত।
পারফরম্যান্স পার্থক্য বিশাল। চেষ্টা করে দেখুন।
Model.objects.filter(condition_a).filter(condition_b).filter(condition_c)
তুলনায় আশ্চর্যজনকভাবে ধীর
Model.objects.filter(condition_a, condition_b, condition_c)
কার্যকর জ্যাঙ্গো ওআরএম-তে উল্লিখিত ,
- ক্যোরিসেটগুলি স্মৃতিতে রাষ্ট্র বজায় রাখে
- চেইন ক্লোনিং ট্রিগার করে, সেই রাজ্যের সদৃশ হয়
- দুর্ভাগ্যক্রমে, ক্যোরিসেটগুলি প্রচুর রাজ্য বজায় রাখে
- যদি সম্ভব হয় তবে একের বেশি ফিল্টার চেইন করবেন না
তুলনা করার জন্য কাঁচা এসকিএল কোয়েরিগুলি দেখতে আপনি সংযোগ মডিউলটি ব্যবহার করতে পারেন। ইউজির দ্বারা ব্যাখ্যা করা হিসাবে, বেশিরভাগ অংশে তারা এখানে প্রদর্শিত হিসাবে সমান:
>>> from django.db import connection
>>> samples1 = Unit.objects.filter(color="orange", volume=None)
>>> samples2 = Unit.objects.filter(color="orange").filter(volume=None)
>>> list(samples1)
[]
>>> list(samples2)
[]
>>> for q in connection.queries:
... print q['sql']
...
SELECT `samples_unit`.`id`, `samples_unit`.`color`, `samples_unit`.`volume` FROM `samples_unit` WHERE (`samples_unit`.`color` = orange AND `samples_unit`.`volume` IS NULL)
SELECT `samples_unit`.`id`, `samples_unit`.`color`, `samples_unit`.`volume` FROM `samples_unit` WHERE (`samples_unit`.`color` = orange AND `samples_unit`.`volume` IS NULL)
>>>
এই উত্তরটি জাঙ্গো ৩.১ এর উপর ভিত্তি করে।
পরিবেশ
মডেল
class Blog(models.Model):
blog_id = models.CharField()
class Post(models.Model):
blog_id = models.ForeignKeyField(Blog)
title = models.CharField()
pub_year = models.CharField() # Don't use CharField for date in production =]
ডাটাবেস সারণী
ফিল্টার কল
Blog.objects.filter(post__title="Title A", post__pub_year="2020")
# Result: <QuerySet [<Blog: 1>]>
Blog.objects.filter(post__title="Title A").filter(post_pub_date="2020)
# Result: <QuerySet [<Blog: 1>, [<Blog: 2>]>
ব্যাখ্যা
আমি আরও কিছু শুরুর আগে আমার খেয়াল করতে হবে যে এই উত্তরটি সেই পরিস্থিতির উপর ভিত্তি করে যা "ম্যান্টটোম্যানিফিল্ড" বা বস্তুগুলি ফিল্টার করার জন্য একটি বিপরীত "ফরেনকি" ব্যবহার করে।
যদি আপনি একই টেবিল বা কোনও "ওয়ানটোওফিল্ড" অবজেক্টগুলিকে ফিল্টার করতে ব্যবহার করেন তবে "মাল্টিপল আর্গুমেন্ট ফিল্টার" বা "ফিল্টার-চেইন" ব্যবহারের মধ্যে কোনও পার্থক্য থাকবে না। তারা উভয়ই "এবং" শর্ত ফিল্টারের মতো কাজ করবে।
"মাল্টিপল আর্গুমেন্টস ফিল্টার" এবং "ফিল্টার-চেইন" কীভাবে ব্যবহার করবেন তা বোঝার সোজা অগ্রসর উপায় হ'ল "ম্যান্টি টোম্যানিফিল্ড" বা একটি বিপরীত "ফরেনকে" ফিল্টারটিতে মনে রাখা, "একাধিক আর্গুমেন্ট ফিল্টার" একটি "ও" শর্ত এবং "ফিল্টার -চেনা "একটি" বা "শর্ত।
"একাধিক তর্কগুলি ফিল্টার" এবং "ফিল্টার-চেইন" কে এত আলাদা করার কারণ হ'ল তারা বিভিন্ন যোগদানের টেবিল থেকে ফলাফল নিয়ে আসে এবং ক্যোয়ারির বিবৃতিতে পৃথক শর্ত ব্যবহার করে।
"একাধিক যুক্তি ফিল্টার" "পোস্ট " ব্যবহার করে use "পাবলিক_ইয়ার" = '২০২০' সরকারী বছর শনাক্ত করতে
SELECT *
FROM "Book"
INNER JOIN ("Post" ON "Book"."id" = "Post"."book_id")
WHERE "Post"."Title" = 'Title A'
AND "Post"."Public_Year" = '2020'
"ফিল্টার-শৃঙ্খল" ডাটাবেসের কোয়েরি ব্যবহার "T1 এর"। "Public_Year" = '2020' পাবলিক বছর চিহ্নিত করতে
SELECT *
FROM "Book"
INNER JOIN "Post" ON ("Book"."id" = "Post"."book_id")
INNER JOIN "Post" T1 ON ("Book"."id" = "T1"."book_id")
WHERE "Post"."Title" = 'Title A'
AND "T1"."Public_Year" = '2020'
কিন্তু কেন বিভিন্ন পরিস্থিতি ফলাফলকে প্রভাবিত করে?
আমি বিশ্বাস করি যে আমাদের মধ্যে যারা এই পৃষ্ঠায় আসেন, আমাকে =] সহ, প্রথমে "একাধিক তর্ক ফিল্টার" এবং "ফিল্টার-চেইন" ব্যবহার করার সময় একই ধারণা অনুধাবন করেন।
যা আমরা বিশ্বাস করি যে ফলটি কোনও একাধিক আর্গুমেন্ট ফিল্টারটির জন্য সঠিক যা অনুসরণ করে একটি টেবিল থেকে নেওয়া উচিত। সুতরাং আপনি যদি "একাধিক তর্কগুলি ফিল্টার" ব্যবহার করেন তবে আপনি আপনার প্রত্যাশা হিসাবে ফলাফল পাবেন।
"ফিল্টার-চেইন" এর সাথে কাজ করার সময়, জ্যাঙ্গো একটি পৃথক ক্যোয়ারী স্টেটমেন্ট তৈরি করে যা উপরের টেবিলটিকে নীচে পরিবর্তিত করে। এছাড়াও, "সার্বজনীন বছর" ক্যোয়ারীর বিবৃতি পরিবর্তনের কারণে "পোস্ট" বিভাগের পরিবর্তে "টি 1" বিভাগের অধীনে চিহ্নিত করা হয়েছে।
তবে এই অদ্ভুত "ফিল্টার-চেইন" টেবিলে ডায়াগ্রামে যোগ দেয় কোথা থেকে?
আমি কোনও ডাটাবেস বিশেষজ্ঞ নই। ডাটাবেসের একই কাঠামো তৈরি করে একই ক্যোয়ারী স্টেটমেন্ট দিয়ে একটি পরীক্ষা করার পরে নীচের ব্যাখ্যাটি আমি এখন পর্যন্ত বুঝতে পেরেছি।
নিম্নলিখিত চিত্রটি দেখায় যে কীভাবে এই অদ্ভুত "ফিল্টার-চেইন" টেবিলের চিত্রটি থেকে আসে।
ডাটাবেস প্রথমে "ব্লগ" এবং "পোস্ট" সারণির একে অপরের সাথে মিল রেখে একটি টেবিল তৈরি করবে।
এরপরে, ডাটাবেসগুলি আবার একই মেলানো প্রক্রিয়াটি করে তবে "টি 1" টেবিলের সাথে মেলাতে পদক্ষেপ 1 ফলাফল সারণীটি ব্যবহার করে যা ঠিক একই "পোস্ট" টেবিল।
এবং এইভাবেই এই অদ্ভুত "ফিল্টার-চেইন" যোগদানের টেবিল ডায়াগ্রাম থেকে আসে।
উপসংহার
সুতরাং দুটি জিনিস "একাধিক তর্কগুলি ফিল্টার" এবং "ফিল্টার-চেইন" আলাদা করে তোলে।
এটি কীভাবে ব্যবহার করবেন তা মনে রাখার নোংরা উপায় "মাল্টিপল আর্গুমেন্টস ফিল্টার" হ'ল "ও" শর্ত এবং "ফিল্টার-চেইন" একটি "ওআর" শর্ত যখন "ম্যান্টিটোমনিফিল্ড" বা বিপরীত "ফরেনকি" ফিল্টারে থাকে।
যদি আপনি এই পৃষ্ঠায় শেষ করে কীভাবে একাধিক চেইন ফিল্টার সহ জ্যাঙ্গো ক্যোয়ারসেটকে গতিশীলভাবে তৈরি করতে চান তবে আপনার কি ফিল্টারগুলি AND
পরিবর্তে প্রকারের হওয়া দরকার OR
, কিউ অবজেক্ট ব্যবহার করে বিবেচনা করুন ।
একটি উদাহরণ:
# First filter by type.
filters = None
if param in CARS:
objects = app.models.Car.objects
filters = Q(tire=param)
elif param in PLANES:
objects = app.models.Plane.objects
filters = Q(wing=param)
# Now filter by location.
if location == 'France':
filters = filters & Q(quay=location)
elif location == 'England':
filters = filters & Q(harbor=location)
# Finally, generate the actual queryset
queryset = objects.filter(filters)
যদি ক এবং খ প্রয়োজন হয়
and_query_set = Model.objects.filter(a=a, b=b)
যদি একটি পাশাপাশি খ প্রয়োজন হয়
chaied_query_set = Model.objects.filter(a=a).filter(b=b)
অফিসিয়াল ডকুমেন্টস: https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-mults- মূল্যবান- সম্পর্কিত সম্পর্ক
সম্পর্কিত পোস্ট: জাজানোতে একাধিক ফিল্টার () চাপানো, এটি কি বাগ?
উদাহরণস্বরূপ, আপনি যখন আপনার সম্পর্কিত বস্তুর কাছে অনুরোধ করবেন তখন একটি পার্থক্য রয়েছে
class Book(models.Model):
author = models.ForeignKey(Author)
name = models.ForeignKey(Region)
class Author(models.Model):
name = models.ForeignKey(Region)
অনুরোধ
Author.objects.filter(book_name='name1',book_name='name2')
খালি সেট দেয়
এবং অনুরোধ
Author.objects.filter(book_name='name1').filter(book_name='name2')
'নেম 1' এবং 'নেম 2' উভয় সহ বই আছে এমন লেখককে ফিরিয়ে দেয়
বিশদগুলির জন্য https://docs.djangoproject.com/en/dev/topics/db/queries/#s-spanning-mult-valued-referencesship দেখুন
Author.objects.filter(book_name='name1',book_name='name2')
এমনকি বৈধ অজগর নয়, এটি হবেSyntaxError: keyword argument repeated