بهینه‌سازی QuerySet در Django با prefetch_related

چطور با prefetch_related تعداد کوئری‌ها رو شدیداً کاهش بدیم و N+1 problem رو حل کنیم.

# قبل: N+1 problem
for author in Author.objects.all():
    posts = author.post_set.all()
    print(author.name, posts.count())

# بعد: با prefetch_related
authors = Author.objects.prefetch_related('post_set')
for author in authors:
2025/10/12 بیشتر
کش کردن view با cache_page در Django

مثال ساده‌ی استفاده از cache_page برای کاهش بار دیتابیس روی viewهای پر بازدید.

from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
from django.views import View

@method_decorator(cache_page(60 * 5), name='dispatch')  # کش برای 5 دقیقه
class LatestPostsView(View):
    def get(self, request):
        posts = Post.objects.order_by('-created_at')[:20]
2025/10/12 بیشتر
افزایش اتمیک فیلد با F() در Django

چطور با F() و update از race condition جلوگیری کنیم وقتی چند درخواست همزمان ویو می‌زنن.

from django.db.models import F

def mark_view(request, post_id):
    # این آپدیت به صورت atomic در DB اجرا میشه
    Post.objects.filter(id=post_id).update(views=F('views') + 1)
    # اگه بحاجة بود مقدار جدید رو بخوای:
    post = Post.objects.get(id=post_id)
    return JsonResponse({"views": post.views})
2025/10/12 بیشتر
ایندکس گذاری ساده در Django برای کوئری‌های سریع

اضافه کردن ایندکس روی فیلدهایی که مرتباً WHERE یا ORDER BY می‌شن.

# models.py
class Order(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.CharField(max_length=30)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        indexes = [
2025/10/12 بیشتر
بهینه‌سازی عملیات Expire کاربران در سیستم‌های Django

پیاده‌سازی بهینه و مقیاس‌پذیر برای آپدیت خودکار وضعیت منقضی‌شدگان دوره‌ها با استفاده از کوئری‌های مستقیم دیتابیس در Django.

# ========================
# LEGACY VERSION (OLD)
# ========================
def update_expired_participants_legacy(course_id: int):
    """
    LEGACY implementation for updating expired participants.

    This version uses jdatetime to handle Persian dates and loops
2025/10/16 بیشتر