manager ها در جنگو

تو این آموزش قراره با manager ها در جنگو آشنا بشیم.
ساخت manager برای مدل در جنگو
همونطور که پیشتر صحبت کردیم، هر مدلی که توی جنگو میسازیم، بصورت پیشفرض یه manager به اسم objects داره که توسط اون، همه اشیای موجود در دیتابیس رو استخراج میکنیم (توجه کنید: همه اشیای موجود).
حالا اگه نخوایم همه چیز رو استخراج کنیم و فقط اطلاعات خاصی رو استخراج کنیم، به جایmanager پیشفرض، میتونیم خودمون بیایم و بنا به صلاحدید خودمون manager دلخواهمون رو تعریف کنیم.
2 تا راه برای اضافه یا شخصی سازی کردن manager برای مدلمون وجود داره:
- متدهای managerمون رو به manager فعلی که داریم باهاش کار میکنیم اضافه کنیم.
- بیایم برای QuerySet اولیه ای که manager پیشفرض داره بر میگردونه manager رو override کنیم و یه manager جدید بسازیم.
تو حالت اول، باید بیایم و از QuerySet API ا مربوطه اون یعنی ()Post.objects.my_manager استفاده کنیم.
تو حالت دوم که اینجا باهاش کار داریم، QuerySet رو ما به این صورت خواهد شد:
Post.my_manager.all()
اینجا برای نمونه میخوایم یه manager شخصی سازی شده بنویسیم که همه پستهایی که منتشر شده ان ( published ) رو برامون استخراج کنه. پس باید در نهایت QuerySet ما همچین چیزی بشه:
Post.published.all()
برای اینکار از بین فایلهای اپلیکیشن blog، فایل models.py رو باز کنین و کدهای زیر رو وارد کنین:
class PublishedManager(models.Manager): def get_queryset(self): return super(PublishedManager, self).get_queryset().filter(status='published') class Post(models.Model): # .... کدهای قبلی objects = models.Manager() # .... منیجر پیشفرض published = PublishedManager() # .... منیجری که ساختیم
با این کار ما متد get_queryset موجود در django.db.models.manager رو override کردیم و عملکرد دلخواه خودمون رو براش تعریف کردیم.
اولین manager ای که توی مدل تعریف بشه، به عنوان manager پیشفرض در نظر گرفته میشه، مگه اینکه با توی Meta خودتون بیاین و default_manager_name رو روی یه manager دیگه که تعریف کردین قرار بدید.
اگه که هیچ manager ای توی مدل تعریف نشده باشه، جنگو بصورت اتوماتیک objects رو به عنوان manager پیشفرض اون مدل در نظر میگیره.
توی کدی که نوشتیم اومدیم هم manager پیشفرض جنگو و هم manager شخصی سازی شده ی خودمون رو برای مدل Post تعریف کردیم.
خب حالا دیگه manager دلخواه خودمون رو تعریف و به مدل اضافه کردیم. حالا میتونیم به راحتی برای پیادهسازی کوئری ازش استفاده کنیم.
بریم واسه امتحانش:
با استفاده از کنسول ترمینال وارد shell میشیم:
python manage.py shell
سپس اول ایمپورت مورد نیاز رو انجام میدیم و بعدش هم به عنوان نمونه میخوایم QuerySet ای بنویسیم که همه مطالب منتشر شده ای که عنوانشون با djangocenter شروع میشه رو بهمون بده:
>>> from blog.models import Post >>> Post.published.filter(title__startswith='djangocenter')
حالا اگر مطلبی داشته باشیم که عنوانش با djangocenter شروع شده باشه و همینطور published شده باشه، برامون برگردونده میشه.
نکته: در صورت override کردن ()get_queryset ممکنه با اشکالاتی روبرو بشیم. ولی فعلاً تو اینجای کار باهاش کاری نداریم(چون فعلاً برامون موردی ایجاد نمیکنه، تا اینکه بعداً بیشتر راجع به manager شخصی سازی شده خودمون صحبت کنیم.
لازم به ذکره که مبحث Managerهای جنگو خیلی مبحث مفصلی هستش که نیاز به توضیحات زیاد و همینطور نمونه مثال های مختلف داره که به مرور چه تو این آموزش، چه تو آموزش ها و دوره های مختلف باهاش بیشتر آشنا میشیم.
فعلاً تو این آموزش به همین استفاده ساده و اولیه از منیجر شخصی سازی شده از جنگو بسنده میکنیم.
جهت مطالعه بیشتر در خصوص Manager های جنگو میتونین داکیومنت خود جنگو رو هم مطالعه کنین:
https://docs.djangoproject.com/en/3.1/topics/db/managers/
تو دوره ساخت وبلاگ با جنگو میتونین با نحوه استفاده پیشرفتهتر manager جنگو رو یاد بگیرید و کاربردهای خیلی ایدهآلی رو پیاده سازی کنید باهاش.
در قسمت بعدی با Manager ها در جنگو آشنا میشیم.
تو آموزش های بعدی مرکز تخصصی آموزش جنگو، کلی مباحث مختلف و خوب داریم که بتونید هرچی بیشتر با مباحث فریمورک قدرتمند جنگو آشنا بشید و یادشون بگیرید.
سوالات و نظراتتون رو هم حتماً حتماً با ما در میون بذارید.
دیدگاهتان را بنویسید