ঠিক যেমন @ আলভারো জ্যাঙ্গোর প্রত্যক্ষ সমতুল্য জবাবটি দিয়েছেন GROUP BY
:
SELECT actor, COUNT(*) AS total
FROM Transaction
GROUP BY actor
নিম্নলিখিত values()
এবং annotate()
পদ্ধতি ব্যবহারের মাধ্যমে হয়:
Transaction.objects.values('actor').annotate(total=Count('actor')).order_by()
তবে আরও একটি বিষয় অবশ্যই উল্লেখ করা উচিত:
যদি মডেলটির ডিফল্ট অর্ডারিং সংজ্ঞায়িত থাকে class Meta
তবে .order_by()
উপযুক্ত ফলাফলের জন্য ধারাটি বাধ্যতামূলক। অর্ডারিংয়ের উদ্দেশ্যে না থাকলেও আপনি এটিকে এড়াতে পারবেন না।
তদ্ব্যতীত, একটি উচ্চ মানের কোডের জন্য এটি সর্বদা একটি .order_by()
ক্লজ পরে রাখার পরামর্শ দেওয়া হয় annotate()
, এমনকি যখন সেখানে কিছু নেই class Meta: ordering
। এই জাতীয় দৃষ্টিভঙ্গি বিবৃতিটিকে ভবিষ্যত-প্রমাণ করে তুলবে: এটি ভবিষ্যতের পরিবর্তনগুলি নির্বিশেষে ঠিক যেমনটি ঠিক তেমন কাজ করবে class Meta: ordering
।
আমি আপনাকে একটি উদাহরণ প্রদান করুন। যদি মডেলটি থাকে:
class Transaction(models.Model):
actor = models.ForeignKey(User, related_name="actor")
acted = models.ForeignKey(User, related_name="acted", null=True, blank=True)
action_id = models.IntegerField()
class Meta:
ordering = ['id']
তারপরে এ জাতীয় পদ্ধতির কাজ হবে না:
Transaction.objects.values('actor').annotate(total=Count('actor'))
এজন্য যে জ্যাঙ্গো GROUP BY
প্রতিটি ক্ষেত্রে অতিরিক্ত কাজ করেclass Meta: ordering
আপনি যদি ক্যোয়ারী মুদ্রণ করতে হবে:
>>> print Transaction.objects.values(
SELECT "Transaction"."actor_id", COUNT("Transaction"."actor_id") AS "total"
FROM "Transaction"
GROUP BY "Transaction"."actor_id", "Transaction"."id"
এটি পরিষ্কার হয়ে যাবে যে সমষ্টিটি ইচ্ছাকৃতভাবে কাজ করবে না এবং তাই .order_by()
এই আচরণটি পরিষ্কার করতে এবং যথাযথ সমষ্টিগত ফলাফলগুলি পাওয়ার জন্য এই ধারাটি অবশ্যই ব্যবহার করা উচিত।
দেখুন: অফিসিয়াল জাজানো ডকুমেন্টেশনে ডিফল্ট ক্রম বা অর্ডার_বি () এর সাথে ইন্টারঅ্যাকশন ।