آموزش manager جنگو

January 2022

در این ویدیو با managerهای جنگو آشنا میشوید و یاد میگیرید که چطور آنها را تغییر دهید. manager رابطی است که با استفاده از آن میتوانید روی modelهای جنگو کوئری بزنید. به طور اتوماتیک جنگو برای هر model یک manager قرار میدهد.

 

دوره پیشنهادی: دوره اول آموزش جنگو(django)

 

 #  نام manager جنگو

به طور پیشفرض، جنگو برای هر model یک manager به نام objects ایجاد میکند. اما اگر بخواهید از کلمه objects به عنوان نام فیلد استفاده کنید یا بخواهید نام manager پیشفرض جنگو را تغییر دهید، میتوانید اینکار را به راحتی برای هر model جداگانه انجام دهید. برای تغییر نام manager، باید یک فیلد به نام دلخواه ساخته و مقدار model.Manager() را به آن اختصاص دهید:

from django.db import models

class Person(models.Model):
    #...
    people = models.Manager()

 

در مدل بالا، استفاده از Person.objects باعث ایجاد ارور AttributeError خواهد شد. اما Person.people.all() تمام اطلاعات داخل مدل را به شما برمیگرداند.

 

ویدوی پیشنهادی: آموزش متد setup در جنگو

 

 #  تغییر manager جنگو

شما میتوانید رفتار managerهای جنگو را تغییر دهید. برای اینکار یک کلاس ساخته و از کلاس Manager ارثبری کند. به دو دلیل ممکن است بخواهید یک manager را سفارشی کنید. اول اضافه کردن یک متد به manager و دوم تغییر queryset اولیه که manager با آن کار میکند. در ادامه هر دوی این دلیل‌ها را بررسی میکنیم.

 

 

 +  اضافه کردن متد به manager

میتوانید به هر تعدادی که نیاز دارید، متد به manager اضافه کنید. فقط در صورتی باید از این روش استفاده کنید که عملکردی که میخواهید اضافه کنید در سطح جدول دیتابیس(table-level) باشد. یعنی قرار است با تمام اطلاعات کار کنید. اگر هدفتان کار کردن فقط با یک سطر از اطلاعات(row-level) است، باید از متد‌های model استفاده کنید.

 

در ادامه این آموزش از مدل زیر استفاده خواهیم کرد:

class Person(models.Model):
	name = models.CharField(max_length=200)
	age = models.PositiveSmallIntegerField(default=0)

	def __str__(self):
		return f'{self.name} - {self.age}'

 

در مدل بالا، نام و  سن کاربر را ذخیره میکنیم. در این بخش هدفمان این است که افرادی که بیشتر از 18 سال سن دارند را انتخاب کنیم. در حالت عادی باید کدی شبیه به این بزنیم:

Person.objects.filter(age__gt=18)

 

اما میتوانیم یک متد به manager اضافه کنیم تا این کار را برایمان انجام دهد و بتوانیم کدی مانند این بزنیم:

Person.objects.adults()

 

برای این کار باید کلاس مانند این بسازیم:

class PersonAdultManager(models.Manager):
	def adults(self):
		return self.filter(age__gt=18)

 

این کلاس یک manager سفارشی است. در داخل این کلاس یک متد به نام adults داریم که افراد بالای 18 سال را برمیگرداند. حالا باید این کلاس را به مدل Person معرفی کنیم. برای اینکار کافیست این manager را به فیلد objects اختصاص دهیم:

class Person(models.Model):
	name = models.CharField(max_length=200)
	age = models.PositiveSmallIntegerField(default=0)
	objects = PersonAdultManager()
	
	def __str__(self):
		return f'{self.name} - {self.age}'

 

اکنون میتوانید با کوئری زیر تمام افراد بالای 18 سال را دریافت کنید:

Person.objects.adults()

 

مقاله پیشنهادی: رمزگذاری و رمزگشایی فایل ها با استفاده از پایتون

 

 +  تغییر queryset اولیه manager

این روش برای زمانی است که بخواهید اطلاعاتی را که متدها با آنها کار میکنند را محدود کنید. مثلا میخواهیم تمام متدها مثل all, filter, exclude و ... در زمان فراخوانی فقط با افرادی کار کنند که سن آنها بالای 18 سال است.

 

برای اینکار در manager سفارشی که ایجاد کردید بای متد get_queryset را بازنویسی کنید:

class PersonAdultManager(models.Manager):
	def get_queryset(self):
		return super().get_queryset().filter(age__gt=18)

 

حالا اگر از کوئری مثل این استفاده کنید، فقط افرادی را برمیگرداند که سن آنها بالای 18 باشد:

Person.objects.all()

 

ارسال نظر

تلاش میکنم سوالات شما را در کمتر از یک روز پاسخ بدم