Q Objects (Complex Queries)
Q Objects: کوئریهای پیچیده 🔍
گاهی میخواید کوئریهای پیچیدهتری بنویسید که با فیلترهای معمولی نمیشه. مثلاً "پستهایی که منتشر شدن یا نویسندهشون فلان کاربره". اینجاست که Q به کمک میاد!
مثال ساده: OR
from django.db.models import Q
from blog.models import Post
# پستهایی که منتشر شدن یا نویسندهشون ali است
posts = Post.objects.filter(
Q(published=True) | Q(author__username='ali')
)
# معادل SQL:
# SELECT * FROM post WHERE published = True OR author_id IN (SELECT id FROM user WHERE username = 'ali')
AND و NOT
from django.db.models import Q
# پستهایی که منتشر شدن و نویسندهشون ali است
posts = Post.objects.filter(
Q(published=True) & Q(author__username='ali')
)
# پستهایی که منتشر نشدن
posts = Post.objects.filter(~Q(published=True))
# معادل: Post.objects.exclude(published=True)
# ترکیب پیچیده
posts = Post.objects.filter(
(Q(published=True) | Q(author__is_staff=True)) &
~Q(title__startswith='Draft')
)
مثال عملی: جستجو
# blog/views.py
from django.db.models import Q
def search_posts(request):
query = request.GET.get('q', '')
if query:
posts = Post.objects.filter(
Q(title__icontains=query) |
Q(content__icontains=query) |
Q(author__username__icontains=query)
)
else:
posts = Post.objects.none()
return render(request, 'blog/search.html', {'posts': posts})
عملگرهای Q:
|: OR (یا)&: AND (و)~: NOT (نفی)
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.