То, что я лично сделал бы, это иметь другой сериализатор для списков и деталей. ModelViewSet имеет метод list()
и retrieve()
. В приведенном ниже примере я переопределил метод retrieve()
и установил атрибут serializer_class
объявленному «подробному» сериализатору. Когда он вызывает super()
, мы теперь используем подробный сериализатор. list()
будет продолжать использовать ItemListSerializer
.
На стороне примечания, если вы собираетесь продолжить использование этого шаблона, вам может потребоваться создать собственный класс ModelViewSet с настраиваемыми list_fields
и detail_fields
.
from rest_framework.serializers import ModelSerializer
from rest_framework.viewsets import ModelViewSet
class ItemListSerializer(ModelSerializer):
class Meta:
model = Item
fields = ('id', 'name')
class ItemDetailSerializer(ModelSerializer):
class Meta:
model = Item
fields = ('id', 'name', 'long_column')
class ItemViewSet(ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemListSerializer
def retrieve(self, request, *args, **kwargs):
self.serializer_class = ItemDetailSerializer
return super(ItemViewSet, self).retrieve(request, *args, **kwargs)