aggregate vs annotage
Biz Django-da queryset ustida qo’shimcha hisob-kitob va guruhlashlarni bajarish uchun annotate
va aggregate
methodlaridan foydalanamiz. Bu postda biz sizlar bilan ularni qanday va qay hollarda ishlatishni ko’rib chiqamiz.
Annotate methodi:
Bu method queryset yangi maydon (field) qo’shadi. Buni biz ko’pincha hisoblashda ishlatamiz. Misol uchun siz OnlineShop loyihangiz bor va Siz har bir foydalanuvchi (user
) shu kungacha qancha mahsulotga order
berganini hisoblamoqchisiz.
from django.db.models import Count
User.objects.annotate(total_orders=Count('orders'))
Bu yerda har bir foydalanuvchiga (User
) tegishli orders
maydoni asosida total_orders
nomli yangi maydon qo'shiladi. Bu maydon har bir foydalanuvchining qancha buyurtma qilganini ko'rsatadi.
Yana bir misol: Agar foydalanuvchi tomonidan buyurtma qilingan mahsulotlar sonini hisoblashni xohlasangiz:
User.objects.annotate(total_products=Count('orders__products'))
Bu misolda har bir foydalanuvchi uchun jami mahsulotlar soni hisoblab beriladi, ya'ni foydalanuvchining qancha turli mahsulotlarga buyurtma bergani ko'rsatiladi.
annotate
ko'p hollarda statistik hisobotlar yoki guruhlashlar kerak bo'lganda ishlatiladi, va natija har bir ob'ektga individual ravishda hisoblangan qo'shimcha maydon sifatida qaytariladi.
Aggregate metodi:
Bu metodni umumiy hisob-kitoblar, masalan: o‘rtacha qiymat, umumiy miqdor yoki maksimal/minimal qiymatlarni olish uchun ishlatamiz. aggregate
bilan ishlaganda biz butun queryset
o'rniga bitta umumiy qiymatni olamiz. Agar sizga har bir Product-ga qo’yilgan reytinglarning o'rtacha qiymatini olmoqchi bo’lsangiz, buni aggregate
yordamida amalga oshirish mumkin.
from django.db.models import Avg
Rate.objects.filter(product_id=pk).aggregate(average_rating=Avg("rate"))
Bu yerda:
Rate
modeli mahsulotlarga qo’yilgan reytinglarni o’z ichiga oladi.filter(product_id=pk)
mahsulotniproduct_id
orqali filterlaydi. Ahir bizga har bir mahsulotga qo’yilgan umumiy raytning o’rta qiymati kerak. Shuning uchun bizpk
mahsulotningunique
adresini beryabmiz.aggregate(average_rating=Avg("rate"))
o'sha mahsulotga tegishli reytinglarning o'rtacha qiymatini hisoblab, natijaniaverage_rating
maydoni sifatida qaytaradi.
Keling endi bu methodlarning ish samaradorligi (Performance) qanday ekanligini ko’rib chiqamiz.
annotate
: Bu method ba'zida katta ma'lumotlar bazasida sekin ishlashi mumkin, ayniqsa ko'p miqdordagi guruhlashlar yoki hisobotlar kerak bo'lsa.annotate
ko'p hollarda SQL-ningGROUP BY
buyrug'idan foydalanadi, bu esa katta miqdordagi ma'lumotlarda resurslarni ko'p talab qilishi mumkin. Shuning uchun kerak bo'lmagan joylarda foydalanmaslik yoki indekslardan foydalanib optimal qilish kerak.aggregate
: Katta ma'lumotlar ustida ishlaganda ham tezroq ishlaydi, chunki bu faqat bitta natijani qaytaradi. Shunga qaramay, katta hajmdagi ma'lumotlar bilan ishlaganda har doim ma'lumotlar bazasi optimizatsiyasiga e'tibor berish kerak.
Xulosa:
Yuqoridagi metodlar bilan ishlaganda to'g'ri indekslarni qo'llash va ma'lumotlar bazasini optimallashtirish katta ma'lumotlar ustida ishlash tezligini sezilarli darajada yaxshilaydi.
Agar katta hajmdagi ma'lumotlar bilan ishlayotgan bo'lsangiz, iloji boricha annotate
va aggregate
larni iloji boricha qisqartiring yoki ularni muvofiq bo'laklarga bo'lib ishlang.
Ko’proq ma’lumot olish uchun 🌐 Telegram kanalga a’zo bo‘ling