Annotations (Custom Fields)
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 اشاره کنید و محاسبات انجام بدید. این کار در سطح دیتابیس انجام میشه و خیلی سریعتره!
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.