Это похоже на хороший SerializerMethodField
случай:
class RegistrySerializer(serializers.ModelSerializer):
registry_type = serializers.SerializerMethodField()
registry_data = serializers.SerializerMethodField()
def get_registry_type(self, obj):
if isinstance(instance, IntraRegistry):
return "intra"
if isinstance(instance, SlackRegistry):
return "slack"
def get_registry_data(self, obj):
if isinstance(instance, IntraRegistry):
return _IntraRegistrySerializer(instance=obj, context=self.context).data
if isinstance(instance, SlackRegistry):
return _SlackRegistrySerializer(instance=obj, context=self.context).data
class Meta:
# `Registry` being the parent model of both `IntraRegistry` and `SlackRegistry`
model = Registry
fields = ["id", "description", "registry_type", "registry_data"]
Выше приведена реализация полей метода сериализатора, и она должна работать, поскольку оба реестра наследуются от Registry
.
Возможно, вам все еще придется настроить его под свои нужды. Одно отличие по сравнению с текущей реализацией состоит в том, что registry_type
и registry_data
теперь будут присутствовать всегда. Они будут null
, если это тип объекта Registry
или какой-либо другой дочерний тип, который здесь не обрабатывается.