from django.db import models from backend_app.fields import JSONField from backend_app.models.abstract.basic_module import ( BasicModule, BasicModuleSerializer, BasicModuleViewSet, ) from backend_app.models.tag import Tag from backend_app.validators.tag import tagged_item_validation class TaggedItem(BasicModule): """ Abstract model to represent a tagged item """ tag = models.ForeignKey(Tag, related_name="+", on_delete=models.PROTECT) custom_content = JSONField(default=dict) class Meta: abstract = True class TaggedItemSerializer(BasicModuleSerializer): """ Serializer for tagged items """ def validate(self, attrs): attrs = super().validate(attrs) tagged_item_validation(attrs) return attrs class TaggedItemViewSet(BasicModuleViewSet): """ Tagged item viewset """ def get_queryset(self): """ Extend the queryset for a bit of optimization """ return super().get_queryset().prefetch_related("tag")