"""passbook API Helpers""" from django.core.exceptions import ObjectDoesNotExist from django.db.models.query import QuerySet from model_utils.managers import InheritanceQuerySet from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField class InheritancePrimaryKeyRelatedField(PrimaryKeyRelatedField): """rest_framework PrimaryKeyRelatedField which resolves model_manager's InheritanceQuerySet""" def get_queryset(self) -> QuerySet: queryset = super().get_queryset() if isinstance(queryset, InheritanceQuerySet): return queryset.select_subclasses() return queryset def to_internal_value(self, data): if self.pk_field is not None: data = self.pk_field.to_internal_value(data) try: queryset = self.get_queryset() if isinstance(queryset, InheritanceQuerySet): return queryset.get_subclass(pk=data) return queryset.get(pk=data) except ObjectDoesNotExist: self.fail("does_not_exist", pk_value=data) except (TypeError, ValueError): self.fail("incorrect_type", data_type=type(data).__name__) class InheritanceModelSerializer(ModelSerializer): """rest_framework ModelSerializer which automatically uses InheritancePrimaryKeyRelatedField for every primary key""" serializer_related_field = InheritancePrimaryKeyRelatedField