دوره‌ها / Django / Q Objects (Complex Queries)

Q Objects (Complex Queries)

15 دقیقه Article

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 (نفی)

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

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

برای ذخیره پیشرفت وارد شوید