Code:
from django.db import models
from django.contrib.contenttypes.models import ContentType
class NodeImageMixin(models.Model):
image = models.ImageField('Node image', upload_to='node_images/', null=True, default=None)
class Meta:
abstract = True
class RelatedModelClassMixin(models.Model):
_related_model_class = models.ForeignKey(to=ContentType, verbose_name='Corresponding model class', on_delete=models.DO_NOTHING, null=True, default=None)
@property
def related_model_class(self):
return self._related_model_class.model_class()
class Meta:
abstract = True
class Section(models.Model):
name = models.CharField(verbose_name='Section', max_length=100)
class Meta:
verbose_name = "Section"
verbose_name_plural = "Sections"
def __str__(self):
return f"Section {self.name}"
class Subsection(NodeImageMixin):
name = models.CharField(verbose_name='Subsection', max_length=50)
section = models.ForeignKey(to=Section, verbose_name='Section', on_delete=models.DO_NOTHING)
class Meta:
verbose_name = "Subsection"
verbose_name_plural = "Subsections"
def __str__(self):
return f"Subsection {self.name}"
class Category(NodeImageMixin, RelatedModelClassMixin):
name = models.CharField(verbose_name='Category', max_length=50)
subsection = models.ForeignKey(to=Subsection, verbose_name='Subsection', on_delete=models.DO_NOTHING)
class Meta:
verbose_name = "Category"
verbose_name_plural = "Categories"
def __str__(self):
return f"Category {self.name}"