متدهای مقایسه‌ای (Lookups)


اغلب اوقات نیاز خواهد بود که داده‌ها را بر اساس شرایط دقیق‌تری—مانند «بزرگ‌تر از»، «کوچک‌تر از»، «شامل یک عبارت» یا «بین دو تاریخ»—فیلتر کنیم. جنگو برای این منظور از سیستم عبارات جستجو (lookup expressions) پشتیبانی می‌کند که با استفاده از دو زیرخط (__) پس از نام فیلد اعمال می‌شوند.

 

⸺ مساوی

projectObj = project.objects.filter(title="Fluent Speech AI Project")

رکوردهایی که فیلد title آن‌ها دقیقاً برابر با مقدار داده‌شده باشد. (معادل با استفاده از = در SQL)

💡 نیازی به __exact نیست؛ این رفتار پیش‌فرض filter() است.


⸺ شامل بودن (Contains)

آخرین رکورد از مجموعه نتایج را برمی‌گرداند. مانند first()، در صورت عدم وجود داده، None بازمی‌گرداند.

projectObjs = project.objects.filter(title__contains="AI")

رکوردهایی که فیلد title آن‌ها عبارت "AI" را در هر جایی داشته باشند (حساس به بزرگ‌وکوچکی حروف).

💡 برای جستجوی غیرحساس به بزرگ‌وکوچکی حروف، از __icontains استفاده می‌شود.


⸺ بزرگ‌تر یا مساوی

projectObjs = project.objects.filter(created__gte="2023-01-01") # gte = greater than or equal

رکوردهایی که تاریخ ایجاد (created) آن‌ها بزرگ‌تر یا مساوی تاریخ داده‌شده باشد.


⸺ کوچک‌تر یا مساوی

projectObj = project.objects.filter(updated__lte='2023-01-01') # lte = less than or equal

رکوردهایی که تاریخ اخرین تغییرات آن‌ها (updated) کوچک‌تر یا مساوی تاریخ مشخص‌شده باشد.


⸺ بین دو مقدار (Range)

projectObj = project.objects.filter(created__range=('2024-01-01', '2025-01-01'))

رکوردهایی که مقدار فیلد created آن‌ها بین دو تاریخ (شامل خود دو سر) باشد.

💡 معادل با  BETWEEN '2024-01-01' AND '2025-01-01' در SQL


⸺ داخل یک لیست (In)

projectObjs = project.objects.filter(subject__in=["AI", "Sports", "Health"])

رکوردهایی که فیلد subject آن‌ها یکی از مقادیر داخل لیست باشد.

💡 معادل با subject IN ('AI', 'Sports', 'Health') در SQL.


⸺ مقدار تهی (Null)

projectObjs = project.objects.filter(content__isnull=False)

رکوردهایی که فیلد content آن‌ها مقدار NULL نباشد (یعنی داده داشته باشد).

💡 برای یافتن رکوردهایی که content آن‌ها خالی است: content__isnull=True.

💡 isnull فقط برای فیلدهایی که null=True دارند معنی دارد. برای فیلدهای CharField معمولاً بهتر است از __exact="" یا __isempty (در صورت نیاز) استفاده کرد.