
روز ۱۷: کار با QuerySet و فیلتر کردن دادهها در جنگو
یکی از قابلیتهای قدرتمند جنگو ORM، QuerySet است که مجموعهای از رکوردهای پایگاه داده را به صورت شیءهای مدل ارائه میدهد و امکان فیلتر کردن، مرتبسازی و دستکاری دادهها را فراهم میکند. QuerySet پایه تمام عملیات دادهای در جنگو است و به توسعهدهندگان اجازه میدهد بدون نوشتن SQL، دادهها را به شکل حرفهای مدیریت کنند. در پروژههای واقعی وب، نیاز به فیلتر کردن، مرتبسازی و محدود کردن دادهها وجود دارد و تسلط بر QuerySet باعث میشود پروژههای شما سریع، قابل توسعه و استاندارد باقی بمانند. در این روز از دوره جنگو، با انواع عملیات روی QuerySet و نحوه استفاده عملی آنها آشنا میشویم.
ایجاد QuerySet و متد all
برای دریافت تمام رکوردهای یک مدل، از متد all استفاده میکنیم. این متد یک QuerySet برمیگرداند که میتوان روی آن عملیات مختلف انجام داد. استفاده از all اولین گام برای شروع کار با دادهها است و به توسعهدهندگان دید کلی از محتویات جدول میدهد. علاوه بر این، QuerySet میتواند در حلقهها و Templateها برای نمایش دادهها به کاربران استفاده شود و عملکرد پروژه را به صورت داینامیک افزایش دهد.
from myapp.models import Course
all_courses = Course.objects.all()
for course in all_courses:
print(course.title)در این مثال، تمام دورهها بازیابی شده و نام آنها چاپ میشود. این روش استاندارد برای مشاهده دادهها و بررسی محتویات جدول در محیط توسعه است.
فیلتر کردن دادهها با متد filter
یکی از مهمترین متدهای QuerySet، متد filter است که امکان انتخاب رکوردهایی با شرایط خاص را فراهم میکند. این متد پارامترهای کلیدی و انعطافپذیر دارد و میتوان با آن دادهها را بر اساس فیلدها و مقادیر مختلف فیلتر کرد. فیلتر کردن دادهها باعث میشود صفحات وب داینامیک و پاسخگو داشته باشیم و دادههای غیرمرتبط به کاربران نمایش داده نشود.
advanced_courses = Course.objects.filter(title__icontains="پیشرفته") recent_courses = Course.objects.filter(created_at__year=2026)
در این مثال، رکوردهایی که عنوان آنها شامل “پیشرفته” است و همچنین دورههای ایجاد شده در سال ۲۰۲۶ فیلتر شدهاند. استفاده از Lookupهای مختلف مانند icontains، exact، gt و lt باعث انعطافپذیری بالای QuerySet میشود.
متد get برای بازیابی رکورد یکتا
زمانی که تنها یک رکورد با شرایط خاص نیاز داریم، از متد get استفاده میکنیم. این متد یک شیء مدل برمیگرداند و اگر رکوردی پیدا نشود یا بیش از یک رکورد موجود باشد، خطا تولید میکند. متد get برای بازیابی اطلاعات منحصر به فرد مانند اطلاعات کاربر، محصول یا سفارش کاربرد دارد و در صفحات پروفایل یا جزییات بسیار مفید است.
django_course = Course.objects.get(id=1) print(django_course.description)
این مثال نشان میدهد که چگونه یک دوره مشخص با شناسه خاص بازیابی و توضیحات آن چاپ میشود. استفاده از get باعث اطمینان از یکتا بودن دادهها میشود.
مرتبسازی دادهها با order_by
QuerySet امکان مرتبسازی رکوردها بر اساس یک یا چند فیلد را فراهم میکند. متد order_by برای نمایش دادهها به ترتیب خاص و ایجاد صفحات مرتب و استاندارد کاربرد دارد. همچنین میتوان با اضافه کردن علامت منفی، ترتیب نزولی را اعمال کرد. مرتبسازی دادهها تجربه کاربری بهتر و ساختار منظم برای پروژههای وب ایجاد میکند.
recent_courses = Course.objects.order_by('-created_at')در این مثال، دورهها بر اساس تاریخ ایجاد مرتب شده و جدیدترین دورهها ابتدا نمایش داده میشوند. این روش برای لیستبندی، داشبوردها و صفحه اصلی سایت کاربرد زیادی دارد.
ترکیب فیلتر و مرتبسازی
QuerySet انعطافپذیری بالایی دارد و میتوان متدهای مختلف را با هم ترکیب کرد. فیلتر کردن و مرتبسازی همزمان باعث میشود دادهها دقیقاً مطابق نیاز پروژه نمایش داده شوند و پیچیدگی در نمایش دادهها کاهش یابد. این قابلیت برای ایجاد صفحات داینامیک، گزارشها و داشبوردهای مدیریتی بسیار ارزشمند است.
advanced_recent_courses = Course.objects.filter(title__icontains="پیشرفته").order_by('-created_at')در این مثال، دورههای پیشرفته فیلتر شده و بر اساس تاریخ ایجاد مرتب شدهاند. این ترکیب متدها به توسعهدهندگان امکان میدهد بدون پیچیدگی و نوشتن SQL، صفحات حرفهای و قابل توسعه بسازند.
نکات حرفهای در استفاده از QuerySet
استفاده از QuerySet باید بهینه و دقیق باشد تا عملکرد پایگاه داده و پروژه کاهش پیدا نکند. استفاده از متدهای select_related و prefetch_related برای روابط بین مدلها باعث کاهش تعداد کوئریها و افزایش سرعت پروژه میشود. همچنین فیلتر کردن دادهها قبل از ارسال به Template باعث میشود صفحات سریعتر بارگذاری شوند و تجربه کاربری بهبود یابد. رعایت این نکات باعث میشود پروژههای جنگو استاندارد، حرفهای و قابل توسعه باقی بمانند.
جمعبندی روز هفدهم
در روز هفدهم یاد گرفتیم QuerySet چیست، چگونه از متدهای all، filter، get و order_by استفاده کنیم و دادهها را به صورت دقیق مدیریت کنیم. همچنین نحوه ترکیب متدها برای فیلتر و مرتبسازی همزمان و نکات بهینهسازی QuerySet بررسی شد. تسلط بر QuerySet پایه تمام پروژههای حرفهای جنگو است و بدون آن مدیریت دادهها، ساخت صفحات داینامیک و نمایش اطلاعات به کاربران بسیار دشوار خواهد بود. یادگیری درست QuerySet باعث میشود پروژههای شما سریع، استاندارد و حرفهای باقی بمانند و قابلیت ارتقا و توسعه در آینده را داشته باشند.