دوره‌ها / Django / Annotations (Custom Fields)

Annotations (Custom Fields)

15 دقیقه Article

Annotations: فیلدهای سفارشی در QuerySet 🏷️

Annotations به شما امکان اضافه کردن فیلدهای محاسبه شده به هر شیء در QuerySet رو می‌ده. این فیلدها در دیتابیس محاسبه میشن و خیلی سریع‌تر از محاسبه در پایتون هستن!

مثال ساده

from django.db.models import Count, Avg
from blog.models import Post, Comment

# تعداد کامنت‌های هر پست
posts = Post.objects.annotate(comment_count=Count('comment'))
for post in posts:
    print(f"{post.title}: {post.comment_count} comments")

# میانگین امتیاز کامنت‌های هر پست
posts = Post.objects.annotate(avg_rating=Avg('comment__rating'))

استفاده در فیلتر

# پست‌هایی که بیشتر از 10 کامنت دارن
popular_posts = Post.objects.annotate(
    comment_count=Count('comment')
).filter(comment_count__gt=10)

# نویسندگانی که بیشتر از 5 پست دارن
from django.contrib.auth.models import User
active_authors = User.objects.annotate(
    post_count=Count('post')
).filter(post_count__gt=5)

Annotations پیچیده

from django.db.models import F, ExpressionWrapper, DecimalField

# محاسبه قیمت نهایی با تخفیف
from shop.models import Product
products = Product.objects.annotate(
    final_price=ExpressionWrapper(
        F('price') * (1 - F('discount') / 100),
        output_field=DecimalField()
    )
)

# استفاده از F برای مقایسه فیلدها
from django.db.models import F
products = Product.objects.filter(price__lt=F('cost') * 1.5)
F expressions: با F() می‌تونید به فیلدهای یک شیء در QuerySet اشاره کنید و محاسبات انجام بدید. این کار در سطح دیتابیس انجام میشه و خیلی سریع‌تره!

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.

برای ذخیره پیشرفت وارد شوید