تخطَّ إلى المحتوى

Q()

شروط OR وNOT معقّدة Q()

Q() يغلّف شرطًا واحدًا بكائن Python يمكن دمجه مع غيره بعمليات AND (&) وOR (|) وNOT (~) — يحل مشكلة أن filter() العادية تجمع كل معاملاتها بـ AND فقط ولا تدعم OR مباشرة.

بدون Q، لا توجد طريقة لكتابة "العنوان يبدأ بكذا أو الحالة كذا" داخل filter() واحدة، لأن كل الوسائط المفتاحية بـ filter() تُجمَع تلقائيًا بـ AND. Q تفتح الباب لأي تركيبة منطقية معقّدة.

الصياغة

from django.db.models import Q
Model.objects.filter(Q(cond1) | Q(cond2))

📄 مثال

from django.db.models import Q

# منشورات منشورة أو تخص المؤلف الحالي (حتى لو مسوّدة)
Post.objects.filter(
    Q(status="published") | Q(author=request.user)
)

# استبعاد بـ NOT
Post.objects.filter(~Q(status="archived"))

أهم المعاملات

المعاملالوظيفة
Q(field=value)شرط مفرد قابل للدمج مع شروط أخرى
| (OR) / & (AND) / ~ (NOT)عمليات دمج منطقية بين كائنات Q

💡 نصائح عملية

  • عند تمرير Q مع وسائط مفتاحية عادية بنفس filter()، يجب أن تسبق كائنات Q الوسائط المفتاحية بترتيب الاستدعاء

⚠️ أخطاء شائعة

  • الظن أن filter(a=1, b=2) تعني OR — كل الوسائط المفتاحية بـ filter() الواحدة تُجمَع بـ AND دائمًا، Q هي الطريقة الوحيدة لـ OR صريح

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DJANGO الكامل بالعربي.