জ্যাঙ্গোর এনোটেট এবং সামগ্রিক পদ্ধতির মধ্যে পার্থক্য?


113

জ্যাঙ্গোর QuerySetদুটি পদ্ধতি রয়েছে annotateএবং aggregate। ডকুমেন্টেশন বলে যে:

সমষ্টি () এর বিপরীতে, টিকা () কোনও টার্মিনাল ধারা নয়। টীকা () ধারাটির আউটপুট একটি ক্যোয়ারীসেট।

তাদের মধ্যে অন্য কোনও পার্থক্য আছে কি? যদি তা না হয় তবে কেন aggregateঅস্তিত্ব থাকবে?

উত্তর:


186

আমি ডকুমেন্টেশন থেকে আপনার উদ্ধৃতি চেয়ে উদাহরণ প্রশ্নগুলিতে ফোকাস করব। পুরো ক্যোরিসেটের Aggregateমানগুলি গণনা করে । ক্যোরিসেটে প্রতিটি আইটেমের জন্য সংক্ষিপ্ত মান গণনা করে।Annotate

মোট পরিমাণ

>>> Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}

ক্যোরিসেটে সমস্ত বইয়ের গড় মূল্য সমন্বিত একটি অভিধান প্রদান করে ।

টীকা

>>> q = Book.objects.annotate(num_authors=Count('authors'))
>>> q[0].num_authors
2
>>> q[1].num_authors
1

q বইগুলির ক্যোয়ারসেটটি তবে প্রতিটি বই লেখকের সংখ্যার সাথে টিকিয়ে দেওয়া হয়েছে।


আমি কি ঠিক করেছি যে .annotate()একা কিউসে ডিবি আঘাত করে না, তবে কলিং q[0].num_authorsকরে? আমি ধরে নিই যে aggregateএটি একটি টার্মিনাল ধারা হিসাবে সর্বদা ডিবিতে আঘাত করবে?
ওরফে ৫১

@ ওরফে ৫১ যা আসলেই মূল প্রশ্নের সাথে সম্পর্কিত, তাই আমি মনে করি না যে আট বছরের পুরানো প্রশ্নে মন্তব্যগুলি জিজ্ঞাসা করার সবচেয়ে ভাল জায়গা। আপনি যদি কোয়েরিগুলি চালিত হয় তা যদি পরীক্ষা করতে চান তবে আপনি চেকconnection.queries করতে পারেন । ইঙ্গিত: এটি কিনা book = q[0]বা `book.num_authors whether কিনা তা অনুসন্ধান করে check
আলাসদায়ের

21

এটিই মূল পার্থক্য, তবে সমষ্টিগুলি টীকাগুলির চেয়ে গ্রেড স্কেলে কাজ করে। টীকাগুলি একটি ক্যোরিসেটে স্বতন্ত্রভাবে আইটেমগুলির সাথে সম্পর্কিত। আপনি যদি Countঅনেকগুলি থেকে বহু ক্ষেত্রের মতো কোনও জিনিসে টিকাটি চালান, আপনি ক্যোয়ারেটের প্রতিটি সদস্যের জন্য একটি পৃথক গণনা পাবেন (একটি অতিরিক্ত বৈশিষ্ট্য হিসাবে)। আপনি যদি একত্রিত হয়ে একই কাজটি করেন তবে এটি ক্যোয়ারসেটের প্রতিটি সদস্যের এমনকি প্রতিলিপিগুলির প্রত্যেকটি সম্পর্ককে গণনা করার চেষ্টা করবে এবং এটি কেবল একটি মান হিসাবে ফিরিয়ে দেবে।


আমি কি ঠিক করেছি যে .annotate()কিউএসে একা ডিবিতে আঘাত হানে না, তবে এমন একটি টীকাটির ফলাফল হিসাবে ডাকে q[0].num_authors? আমি ধরে নিই যে aggregateএটি একটি টার্মিনাল ধারা হিসাবে সর্বদা ডিবিতে আঘাত করবে?
ওরফে 51

21

সমষ্টিগত সমষ্টি একটি সম্পূর্ণ ক্যোরিসেটের উপরে ফলাফল (সংক্ষিপ্ত) মান দেয়। সার্বিকভাবে রো-সেট থেকে একক মান পাওয়ার জন্য রোউসেটের ওপরে পরিচালনা করুন ((উদাহরণস্বরূপ, রোউসেটের সমস্ত দামের যোগফল)। সমষ্টি সমগ্র ক্যোরিসেটে প্রয়োগ করা হয় এবং এটি একটি সম্পূর্ণ ক্যোরিসেটের ফলাফল (সংক্ষিপ্তসার) মান উত্পন্ন করে।

মডেল:

class Books(models.Model):
    name = models.CharField(max_length=100)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=5, decimal_places=3)

আবরণের ভেতরে:

>>> Books.objects.all().aggregate(Avg('price'))
# Above code will give the Average of the price Column 
>>> {'price__avg': 34.35}

অ্যানোটেট অ্যানোটেট একটি ক্যোরিসেটে প্রতিটি বস্তুর জন্য একটি স্বাধীন সংক্ষিপ্তসার তৈরি করে (

মডেল:

class Video(models.Model):
    name = models.CharField(max_length=52, verbose_name='Name')
    video = models.FileField(upload_to=document_path, verbose_name='Upload 
               video')
    created_by = models.ForeignKey(User, verbose_name='Created by', 
                       related_name="create_%(class)s")
    user_likes = models.ManyToManyField(UserProfile, null=True, 
                  blank=True, help_text='User can like once', 
                         verbose_name='Like by')

দেখুন:

videos = Video.objects.values('id', 'name','video').annotate(Count('user_likes',distinct=True)

দেখুন এটি প্রতিটি ভিডিওর জন্য পছন্দ গণনা করা হবে


distinct=Trueশেষ উদাহরণে প্রয়োজন হয় কেন ?
ইউরি লিওনভ

@ ইউরিলিওনোভ স্বতন্ত্র = সত্য যে অপারেশনটি স্বতন্ত্র মূল্যে সম্পাদন করে তার জন্য ব্যবহৃত। এটি জিজ্ঞাসা করা বর্তমান প্রশ্নের সাথে সম্পর্কিত নয়। এর জন্য দুঃখিত, আমি আমার কোডটিতে ব্যবহার করেছি।
বিনয় কুমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.