django rest框架中ModelSerializer的不同字段设置

peo*_*eon 4 django django-rest-framework

我有一个简单的ModelSerializer,我想对列表/细节使用不同的字段,如下所示,是否可能?

class ItemSerializer(serializers.ModelSerializer):
  class Meta:
    model = Item
    list_fields = ('id', 'name')
    detailed_fields = ('id', 'name', 'long_column')
Run Code Online (Sandbox Code Playgroud)

Mic*_*l B 6

我个人会做的是为列表与细节设置不同的序列化程序.ModelViewSet有一个list()retrieve()方法.在下面的示例中,我重写了retrieve()方法并将serializer_class属性设置为声明的"detail"序列化程序.当它调用时super(),我们现在使用详细的序列化器.该list()会继续使用ItemListSerializer.

另外,如果您要继续使用此模式,最好使用自定义list_fields和创建自己的ModelViewSet类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)
Run Code Online (Sandbox Code Playgroud)

  • 我想如果您在`retrieve`调用后立即使用`list`,则此代码可能会中断。为了对不同的端点使用不同的序列化器,正确的方法将是重写`get_serializer_class()`。/sf/answers/3084952041/ (2认同)