#آموزش #جنگو ⚡️ میدونستین چند شرط داخل filter همیشه با AND ترکیب میشن و برای OR باید از Q استفاده کنید؟ فرض کنید مدل Product با فیلدهای name، price و category چهار محصول داره: Book (120، books)، Pen (15، office)، Bag (300، bags) و Lamp (80، home). محصولهایی رو میخوایم که یا ارزونتر از 50 باشن، یا توی دستهٔ books: from django.db.models import Q result = Product.objects.filter( Q(price__lt=50) | Q(category="books") ).order_by("name") print([p.name for p in result]) خروجی: ['Book', 'Pen'] هر Q یک شرط رو نگه میداره و علامت | دو شرط رو با OR ترکیب میکنه؛ Pen بهخاطر قیمتش اومد و Book بهخاطر دستهاش. ✔️ حالت پیشفرض: AND وقتی چند شرط رو با کاما داخل filter مینویسید، همهشون باید با هم برقرار باشن: result = Product.objects.filter( price__lt=200, category="books" ) print([p.name for p in result]) خروجی: ['Book'] همین رو با علامت & بین دو Q هم میشه نوشت؛ ولی وقتی فقط AND لازم دارید، همون کاما خواناتره. ❌ برعکس کردن شرط با ~Q علامت ~ شرط رو برعکس (NOT) میکنه؛ مثلاً همهٔ محصولها بهجز دستهٔ books: from django.db.models import Q result = Product.objects.filter( ~Q(category="books") ).order_by("name") print([p.name for p in result]) خروجی: ['Bag', 'Lamp', 'Pen'] ⚠️ترتیب Q و شرطهای معمولی مهمه میتونید Q و شرطهای معمولی (مثل category=...) رو با هم بیارید، ولی طبق مستندات جنگو Q باید اول بیاد؛ وگرنه پایتون همون اول خطای سینتکس میده: from django.db.models import Q result = Product.objects.filter( category="books", Q(price__lt=50) ) خروجی: SyntaxError: positional argument follows keyword argument شکل درستش اینطوریه (قیمت کمتر از 50 یا بیشتر از 200، و همزمان دستهٔ office): from django.db.models import Q result = Product.objects.filter( Q(price__lt=50) | Q(price__gt=200), category="office" ) print([p.name for p in result]) خروجی: ['Pen'] ▫️ یک Q خالی هیچ شرطی نداره؛ برای همین میشه از اون شروع کرد و توی حلقه شرط اضافه کرد (مثلاً برای فرم جستوجو): from django.db.models import Q query = Q() for word in ["Book", "Lamp"]: query |= Q(name=word) result = Product.objects.filter(query).order_by("name") print([p.name for p in result]) خروجی: ['Book', 'Lamp'] ▫️ برای دیدن SQL ساختهشده، print(result.query) بزنید؛ برای مثال اول، جنگو یک WHERE با OR بین دو شرط میسازه. ▫️ همهٔ این مثالها یک QuerySet برمیگردونن، پس میشه بعدش order_by یا هر فیلتر دیگهای هم اضافه کرد. آموزش هوش مصنوعی و برنامه نویسی 👇 @codingyar وبسایت آموزشی: www.codingyar.com
آموزش #جنگو ⚡️ میدونستین چند شرط داخل filter همیشه با AND ترکیب…
۱۵ آبان ۱۴۰۵ ۸۹