2015-05-17 6 views
2

У меня есть простой ModelSerializer, и я хочу использовать разные поля для списков/деталей, как показано ниже, возможно ли это?настройка различных полей для ModelSerializer в каркасе отдыха django

class ItemSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Item 
    list_fields = ('id', 'name') 
    detailed_fields = ('id', 'name', 'long_column') 

ответ

4

То, что я лично сделал бы, это иметь другой сериализатор для списков и деталей. 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) 
Смежные вопросы