آموزش #جنگو ‌ ⚡️ می‌دونستین چند شرط داخل filter همیشه با AND ترکیب…

#آموزش #جنگو ‌ ⚡️ می‌دونستین چند شرط داخل 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

۱۵ آبان ۱۴۰۵ ۸۹