আমি দুটি জাঙ্গো ক্যোয়ারসেটের মিলন কীভাবে খুঁজে পাব?


92

আমি দুটি কাস্টম ম্যানেজার পদ্ধতি সহ একটি জ্যাঙ্গো মডেল পেয়েছি। প্রতিটি বস্তুর ভিন্ন বৈশিষ্ট্যের ভিত্তিতে মডেলটির অবজেক্টগুলির একটি পৃথক উপসেট প্রদান করে।

ক্যুরিসেট পাওয়ার কোনও উপায় আছে, বা কেবলমাত্র সামগ্রীর একটি তালিকা, এটি প্রতিটি ম্যানেজার পদ্ধতিতে ক্যোসারেটগুলির মিলন?


4
(ক মোছা উত্তর থেকে) একটি পরিবর্তন এই প্রশ্ন দেখতে পাবেন যে বিভিন্ন মডেল থেকে QuerySets সঙ্গে কাজ করে: stackoverflow.com/questions/431628/...
rnevius

4
সংস্করণ 1.11 থেকে শুরু করে, জাঙ্গো কোয়েরি সেটগুলিতে বিল্টিন ইউনিয়ন পদ্ধতি রয়েছে। আমি এটি ভবিষ্যতের রেফারেন্সের উত্তর হিসাবে যুক্ত করেছি
জোসে চেরিয়ান

উত্তর:


179

এটি কাজ করে এবং কিছুটা পরিষ্কার দেখাচ্ছে:

records = query1 | query2

আপনি যদি নকলগুলি না চান, তবে আপনাকে সংযোজন করতে হবে .distinct():

records = (query1 | query2).distinct()

4
যখন স্বীকৃত উত্তরটি ইউনিয়নকে পুনরাবৃত্ত করতে পারে (যেমন সঠিক হতে পারে তবে তালিকাটি) যেমন ওপি জিজ্ঞাসা করেছে, এই পদ্ধতিটি ক্যোয়ারসেটের সত্যিকারের ইউনিয়ন দেয়। এই ক্যোয়ারসেটটি আরও চালিত হতে পারে যা অনেক পরিস্থিতিতেই পছন্দসই।
ক্রিস্টিয়ান সাইবুলস্কি

4
জাজানো বাগের কারণে, এর সাথে কাজ করার সময় এই নির্মাণটি কখনও কখনও ভুল ফলাফলগুলি ফিরিয়ে দিতে পারে ManyToManyField। উদাহরণস্বরূপ, আপনি কখনও কখনও দেখতে পাবেন যে records.count()এটির চেয়ে বেশি হবে query1.count() + query2.count(), যা স্পষ্টতই ভুল।
জিয়ান

4
@ জিয়ান আপনি বাগ এবং জাঙ্গোপ্রজেক্ট ইস্যুটির একটি লিঙ্কের সাথে জাঙ্গো সংস্করণটি পরিষ্কার করতে পারেন?
আইএমফ্লেচার 3:53

10
রেকর্ডস = কোয়েরি 1 | জিজ্ঞাসা 2; রেকর্ডস = রেকর্ডস.ডিসিনটিন্ট () আমাকে সঠিক ফলাফল দেবে
ইউজিন

4
আপনি পাইথনের অপারেটরগুলি ওভারলোড করতে পারেন। ডকস.পাইথন.আর . / ২ / লাইব্রেরি / অপারেটর.এইচটিএমএল দেখুন । তাই জ্যাঙ্গো যা করে তা হল ক্যুরিসেট অবজেক্টের জন্য বিশেষ পদ্ধতি তৈরি করা। কোড এখানে দেখুন: github.com/django/django/blob/master/django/db/models/...QuerySet বর্গ জন্য পদ্ধতি উপলব্ধ __and__এবং __or__যে বলা হয় যখন &বা |অপারেটার দুই মধ্যে ব্যবহার করা হয় QuerySetবস্তু (এছাড়াও জন্য ব্যবহৃত Qপাশাপাশি শ্রেণী )।
জর্দানের রিইটার

49

সংস্করণ 1.11 থেকে শুরু করে , জাঙ্গো ক্যোয়ারসেটগুলির একটি বিল্টিন ইউনিয়ন পদ্ধতি রয়েছে।

q = q1.union(q2) #q will contain all unique records of q1 + q2
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates
q = q1.union(q2,q3) # more than 2 queryset union

আরও উদাহরণের জন্য এটিতে আমার ব্লগ পোস্টটি দেখুন ।


আমি সমস্ত = সত্যই কাজ করতে পারি না। আমার ক্যোয়ারসেটটি ক্লায়েন্টের কাছে ফেরত দেওয়ার আগে সেটটিতে কাস্টিং করা শেষ হয়েছিল।
ব্র্যাডেন হল্ট

4
@ ব্র্যাডেনহোল্ট, সমস্ত = সত্য, এর অর্থ এটিতে সদৃশ রেকর্ড থাকবে। সেটটিতে কাস্ট করা এড়াতে আপনি কেবল সমস্ত = সত্যকে মুছে ফেলতে পারেন।
জোসে চেরিয়ান

এই কাজ না করে জ্যাঙ্গো ফিল্টারব্যাকেন্ড, আমি কীভাবে ইউনিয়ন এবং জ্যাঙ্গো ফিল্টারব্যাকেন্ড ব্যবহার করতে পারি?
নেসালেক্সি

দুর্ভাগ্যক্রমে, এটি মডেলের মেটাতে সংজ্ঞায়িত ডিফল্ট ক্রম সহ মডেলদের জন্য কাজ করবে বলে মনে হয় না। আমি যখনই এইগুলিকে .union এর সাথে একত্রিত করার চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই: "যৌগিক বিবৃতিগুলির সাবকোয়ারিগুলিতে অনুমতি দেওয়া হয় না।
জেরিয়াল

4

আমি 'ক্যুওয়ারি 1' এর পরিবর্তে 'ক্যোয়ারী 1.উনিয়ন (ক্যোয়ারি 2)' ব্যবহার করার পরামর্শ দেব জিজ্ঞাসা 2 '; আমি উপরের দুটি পদ্ধতির থেকে পৃথক ফলাফল পেয়েছি এবং পূর্বেরটি আমার প্রত্যাশা ছিল। নিম্নলিখিতটি আমি যা পেরেছিলাম তা হল:

print "union result:"
for element in query_set1.union(query_set2):
    print element

print "| result:"
for element in (query_set1 | query_set2):
    print element

ফলাফল:

union result:
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object
KafkaTopic object

| result:
KafkaTopic object
KafkaTopic object

4
কোড পেস্ট করুন, কোডের চিত্র নয়। চিত্রগুলির পাঠ্যটি অনুসন্ধানযোগ্য নয়, আপনি যাচাইকরণের জন্য এটি আপনার সম্পাদকের কাছে অনুলিপি / আটকাতে পারবেন না এবং প্রয়োজনের চেয়ে আরও বেশি জায়গা নেন। কোডটিকে কোড হিসাবে চিহ্নিত করতে ব্যাকটিক্স ব্যবহার করুন, যাতে এটি সঠিকভাবে ফর্ম্যাট হয়। পাঠ্য প্রবেশের বাক্সের পাশে "সহায়তা" লিঙ্কটি দেখুন।
জেরিয়াল

আপডেট করার জন্য ধন্যবাদ। :)
জেরিয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.