فیلتر کردن (QuerySet Filter)
فیلتر کردن: پیدا کردن دقیق دادهها 🎯
با استفاده از 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
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.