Django Model Abstraction
In Django, we can use the abstraction concept in defining the tables for the columns which are common. We can make any modal as an abstract model by adding this meta property abstract = true.
Suppose you have some column fields which are common in all the tables, which you can abstract and have to just inherit this abstract class to add the fields in the model which can help you to follow the Don't Repeat Yourself principle. Let see an example
class Base(models.Model): """ Base parent class for all the models """ timestamp = models.DateTimeField(blank=True, db_index=True) is_active = models.BooleanField(default=True, db_index=True) def __init__(self, *args, **kwargs): super(Base, self).__init__(*args, **kwargs) class Meta: abstract = True class OttPlatform(Base): """ """ name = models.CharField(max_length=200) ott_type = models.CharField(max_length=50) def __str__(self): return self.name
So, this helps you to stop duplication of code, but there is one more issue we can handle here. The is_active column is used to mark the row as deleted. Mainly in our use case, we can't delete the data from the table to keep the track of changes. So is_active field helps us with that. But now we have to use the is_active filter in every query.
We can solve this by overriding the manager, let see how
# First, define the Manager subclass. class AtiveOTTManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_active=True) class OttPlatform(Base): """ """ name = models.CharField(max_length=200) ott_type = models.CharField(max_length=50) # the order matters, first come default manager, then custom managers. objects = models.Manager() # The default manager. active_objects = AtiveOTTManager() # The active OTT manager. def __str__(self): return self.name # Now you have to do OttPlatform.active_objects.all(), to get all the active OTT platform name.
So, with overriding the manager we don't have to write a filter for is_active in every query.