Django Model Inheritance with Custom Manager
10 Oct 2016If you have multiple classes with the same attribute(s) and custom queryset(s) it make sense to use Django inheritance feature. Define parent class with abstract = True
and set that custom manager on the parent class.
from django.db import models
class BaseQuerySet(models.QuerySet):
def active(self):
return self.filter(is_active=True)
class Parent(models.Model):
is_active = models.BooleanField(default=True)
objects = BaseQuerySet.as_manager()
class Meta:
abstract = True
Define the children class and inherit from previous Parent
class.
class ChildrenA(Parent):
name = models.CharField(max_length=255)
class ChildrenB(Parent):
title = models.CharField(max_length=255)
Both ChildrenA
and ChildrenB
have is_active
attribute and custom queryset active
.
ChildrenA.objects.active().filter(name__startswith='Gilang')
ChildrenB.objects.active().filter(title__endswith='Awesome')