Django Managers

A manager is a special attribute used to query the Database while using Django framework. For e.g. In Django codeĀ  Person.objects.all Person is the model. objects is theĀ manager. Points to remember:

  1. Each Django model has at least one manager.
  2. It is possible to write custom managers.

Why do we need custom manager? There are several reasons , but the most common ones being,

  1. To add extra manager methods to provide table-level functionality to models.
  2. To modify the initial QuerySet that is returned by the manager.
  3. Helps to avoid having duplicate code.

Example of a custom manager for Person Model

#models.py
from django.db import models

class PersonManager(models.Manager):
	def person_count(self,keyword):
		return self.filter(name__icontains = keyword).count()

<em>class Person(models.Model):</em>
<em> name = models.CharField(max_length=50)</em>
# some code goes here ...
<em>objects = PersonManager()</em> # This assignment will replace the "default" manager for the model.

<em> Person.objects.person_count('john')</em> # will return the count of people with name 'John'
3

You can modify initial QuerySet by overriding Manager.get_query_set() method. A good example is

<em>class MaleManager(models.Manager):</em>
<em> def get_query_set(self):</em>
<em> return super(MaleManager, self).get_query_set().filter(sex='M') # filter Male.</em>

<em>class FemaleManager(models.Manager):</em>
<em> def get_query_set(self):</em>
<em> return super(FemaleManager, self).get_query_set().filter(sex='F') # filter Female's</em>

<em>class Person(models.Model):</em>
<em> first_name = models.CharField(max_length=50)</em>
<em> last_name = models.CharField(max_length=50)</em>
<em> sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))</em>
<em>people = models.Manager()</em> # default manager
<em>malemgr = MaleManager()</em> # manager to manipulate initial query set for filtering males.
<em>femmgr = FemaleManager()</em> # manager to manipulate initial query set for filtering females.

Calls to these managers are done as follows:

Person.malemgr.all() Person.femmgr.all() Person.people.all()