Чтобы не писать кучу сериализаторов решил попробовать dynamically modifying fields. Делал все согласно документации, то есть определил сериализатор:
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
И унаследовался от него:
class TrainingSerializer(DynamicFieldsModelSerializer):
trainer = TrainerSerializer()
url = serializers.CharField(source='get_absolute_url', read_only=True)
class Meta:
model = Training
fields = ['title', 'description', 'slug', 'trainer', 'url', 'dates']
Собственно проблема в следующем: как вызвать TrainingSerializer во вьшке с нужными мне полями?
Попытка сделать вот так конечно же приводит к исключению
TypeError: 'TrainingSerializer' object is not callable.
class TrainingDetailAPIView(RetrieveAPIView):
queryset = Training.objects.all()
serializer_class = TrainingSerializer(fields=('title', 'description'))
lookup_field = 'slug'
Пробовал через shell - все работает преотлично:
TrainingSerializer(fields=('title', 'description')):
title = CharField(max_length=250)
description = CharField(style={'base_template': 'textarea.html'})