জাঙ্গো: ক্যোয়ারির মাধ্যমে কলাম মানগুলির যোগফল গণনা করুন


92

আমার একটা মডেল আছে

class ItemPrice( models.Model ):
     price = models.DecimalField ( max_digits = 8, decimal_places=2 )
     ....

priceএই ক্যোয়ারসেটে যোগফলের গণনা করার জন্য আমি এটি চেষ্টা করেছি:

items = ItemPrice.objects.all().annotate(Sum('price'))

এই কোয়েরিতে কী ভুল? বা priceকলামের যোগফল গণনা করার অন্য কোনও উপায় আছে ?

আমি জানি ক্যোরিসেটে লুপ ব্যবহার করে এটি করা যেতে পারে তবে আমার একটি মার্জিত সমাধান দরকার।

ধন্যবাদ!


এটা কি তোমার প্রশ্নের উত্তর? জ্যাঙ্গো এসইএম কোয়েরি?
ফ্লিম

উত্তর:


196

আপনি সম্ভবত খুঁজছেন aggregate

from django.db.models import Sum

ItemPrice.objects.aggregate(Sum('price'))
# returns {'price__sum': 1000} for example

4
যার মূল্য = 5000 আমি কীভাবে মোট গণনা পেতে পারি?
অনুজ শর্মা

6
রিটার্ন অভিধান মনে রাখবেন না ভাসা / পূর্ণসংখ্যার উদাহরণ {'price__sum':1000}। এর সাথে ভাসা / পূর্ণসংখ্যা পেতে পারেনyourdict['price__sum']
জোশ

35

টীকাগুলি ফলাফলগুলিতে একটি ক্ষেত্র যুক্ত করে:

>> Order.objects.annotate(total_price=Sum('price'))
<QuerySet [<Order: L-555>, <Order: L-222>]>

>> orders.first().total_price
Decimal('340.00')

সমষ্টি জিজ্ঞাসিত ফলাফল সহ একটি ডিক ফেরত দেয়:

>> Order.objects.aggregate(total_price=Sum('price'))
{'total_price': Decimal('1260.00')}

আমি আপনাকে keyযোগফল কীভাবে নির্দিষ্ট করতে হবে তা দেখিয়ে প্রশংসা করছি value
মাইকি

32

.aggregate(Sum('column'))['column__sum']নীচে আমার উদাহরণ রেফার ব্যবহার করুন

sum = Sale.objects.filter(type='Flour').aggregate(Sum('column'))['column__sum']

5

সিপ্রোফাইল প্রোফাইলার ব্যবহার করে , আমি দেখতে পাচ্ছি যে আমার বিকাশের পরিবেশে, সামগ্রিক ব্যবহারের চেয়ে তালিকার মানগুলি যোগ করা আরও কার্যকর (দ্রুত) Sum()। যেমন:

sum_a = sum([item.column for item in queryset]) # Definitely takes more memory.
sum_b = queryset.aggregate(Sum('column')).get('column__sum') # Takes about 20% more time.

আমি এটি বিভিন্ন প্রসঙ্গে পরীক্ষা করেছি এবং দেখে মনে হচ্ছে aggregateএকই ফলাফলটি তৈরি করতে সবসময় বেশি সময় লাগে। যদিও আমার সন্দেহ আছে যে তালিকার সংক্ষিপ্তসার পরিবর্তে এটিকে ব্যবহার করার জন্য মেমোরি ভিত্তিতে সুবিধা থাকতে পারে।


4
অন্যথা, একটি তালিকা পরিবর্তে একটি জেনারেটর অভিব্যক্তি ব্যবহার করুন: sum_a = sum(item.column for item in queryset)। পার্থক্যটি হ'ল সরানো []গুলি। এটি sum()পুনরাবৃত্ত হওয়ার আগে পুরো তালিকাটি গণনা করার জন্য এটি মেমরির স্থানটি সংরক্ষণ করে ।
কোড-শিক্ষানবিশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.