دوره‌ها / Django / فیلتر کردن (QuerySet Filter)

فیلتر کردن (QuerySet Filter)

25 دقیقه Article

فیلتر کردن: پیدا کردن دقیق داده‌ها 🎯

با استفاده از filter() می‌تونید داده‌ها رو بر اساس شرایط خاص پیدا کنید. این یکی از پرکاربردترین متدهای QuerySet است!

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

# فیلتر ساده
published_posts = Post.objects.filter(published=True)

# فیلتر چند شرطی (AND)
recent_published = Post.objects.filter(
    published=True,
    created_at__gte=datetime.now() - timedelta(days=7)
)

# فیلتر با OR
from django.db.models import Q
posts = Post.objects.filter(
    Q(title__icontains="python") | Q(content__icontains="django")
)

Lookup های مفید:

  • __exact: دقیقاً برابر (پیش‌فرض)
  • __iexact: برابر (بدون حساسیت به بزرگی/کوچکی)
  • __contains: شامل
  • __icontains: شامل (بدون حساسیت)
  • __startswith: شروع با
  • __endswith: پایان با
  • __gte, __lte: بزرگتر/مساوی، کوچکتر/مساوی
  • __year, __month: فیلتر بر اساس تاریخ

مثال‌های پیشرفته

# فیلتر بر اساس ForeignKey
posts = Post.objects.filter(author__username='ali')

# فیلتر بر اساس تاریخ
from datetime import datetime, timedelta
last_week = datetime.now() - timedelta(days=7)
recent_posts = Post.objects.filter(created_at__gte=last_week)

# فیلتر چند شرطی
popular_posts = Post.objects.filter(
    views__gte=100,
    published=True,
    created_at__year=2024
)
نکته: filter() یک QuerySet جدید برمی‌گردونه و داده‌های اصلی رو تغییر نمی‌ده. برای تغییر داده‌ها از update() استفاده کنید.

🎯 تمرین عملی:

یک QuerySet بسازید که پست‌های منتشر شده در ماه جاری رو پیدا کنه که view های اون‌ها بیشتر از 50 باشه و عنوانشون شامل کلمه "پایتون" باشه.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

تمرین: فیلتر پیشرفته Hard
سوال تمرین

🎯 تمرین عملی: جستجوی پیچیده

یک QuerySet بسازید که پست‌های منتشر شده در ماه جاری با view بیشتر از 50 و عنوان شامل 'پایتون' رو پیدا کنه.

پاسخ تمرین
PYTHON
from .models import Post
from datetime import datetime
from django.utils import timezone

def find_special_posts():
    now = timezone.now()
    start_of_month = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
    
    posts = Post.objects.filter(
        published=True,
        created_at__gte=start_of_month,
        views__gt=50,
        title__icontains='پایتون'
    )
    return posts

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

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