
مدل منیجر پیشفرض برای هر مدل، objects است. این مدیر تمام آبجکتهای موجود در دیتابیس را بازیابی میکند. با این حال، ما میتوانیم برای مدلها، مدیرهای سفارشی (Custom Managers) تعریف کنیم.
بیایید یک مدیر سفارشی ایجاد کنیم تا تمام پستهایی که دارای وضعیت PUBLISHED هستند را بازیابی کند. برای افزودن یا سفارشیسازی مدیرها در مدل، دو روش کلی وجود دارد: میتوانید متدهای اضافی به یک مدیر موجود اضافه کنید، و یا با تغییر دادن QuerySet اولیه که مدیر برمیگرداند، یک مدیر جدید بسازید. روش اول، امکان استفاده از نشانگذاری (Notation) به شکل ()Post.objects.my_manager را فراهم میکند و روش دوم، امکان استفاده از نشانگذاری به شکل ()Post.my_manager.all را به شما میدهد.
ما برای پیادهسازی مدیری که اجازه میدهد پستها را با دستور ()Post.published.all بازیابی کنیم، روش دوم را انتخاب میکنیم.
فایل models.py در اپلیکیشن وبلاگ خود را به صورت زیر ویرایش کنید تا این مدیر سفارشی اضافه شود:
class PublishedManager(models.Manager): def get_queryset(self): return ( super().get_queryset().filter(status=Post.Status.PUBLISHED) ) class Post(models.Model): # model fields # ... objects = models.Manager() # مدیر پیشفرض (The default manager) published = PublishedManager() # مدیر سفارشی ما (Our custom manager) class Meta: ordering = ['-publish'] indexes = [ models.Index(fields=['-publish']), ] def __str__(self): return self.title
اولین مدل-منیجری که در مدل تعریف میشود، تبدیل به مدل-منیجر پیشفرض میگردد. شما میتوانید از ویژگی Meta یعنی default_manager_name استفاده کنید تا مدیر پیشفرض متفاوتی را مشخص نمایید. اگر هیچ مدیری در مدل تعریف نشود، جنگو به صورت خودکار مدیر objects را برای آن ایجاد میکند. اگر هر مدیری برای مدل خود تعریف کنید اما بخواهید objects را نیز حفظ کنید، باید آن را به صورت صریح (Explicit) در مدل خود اضافه نمایید. در کد بالا، ما هم مدیر پیشفرض objects و هم مدیر سفارشی published را به مدل Post اضافه کردیم.
متد get_queryset() در یک مدیر، QuerySet اجرایی را برمیگرداند. ما این متد را بازنویسی (Override) کردیم تا یک QuerySet سفارشی بسازیم که پستها را بر اساس فیلد status فیلتر کند و QuerySet خروجی تنها شامل پستهایی با وضعیت PUBLISHED باشد.
اکنون که مدیر سفارشی را برای مدل Post تعریف کردیم، بیایید آن را تست کنیم!
سرور توسعه را مجدداً با دستور زیر در محیط shell اجرا کنید:
python manage.py shell
حال میتوانید مدل Post را import کرده و با اجرای QuerySet زیر، تمام پستهای منتشر شدهای که عنوان آنها با “Who” شروع میشود را بازیابی کنید:
>>> from blog.models import Post >>> Post.published.filter(title__startswith='Who')
برای دریافت نتیجه در این QuerySet، اطمینان حاصل کنید که در آبجکت Post که عنوان آن با عبارت “Who” شروع میشود، فیلد status را بر روی PUBLISHED تنظیم کرده باشید.
پست قبلی: (۱.۱۲: کار با QuerySet و جستجو در پایگاه داده)
پست بعدی: (۱.۱۴: تنظیم url صفحات و ایجاد صفحه نمایش پست های وبلاگ)