我有一个简单的ModelSerializer,我想对列表/细节使用不同的字段,如下所示,是否可能?
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
list_fields = ('id', 'name')
detailed_fields = ('id', 'name', 'long_column')
答案 0 :(得分:5)
更新:2019年5月23日
可在此处找到更好的答案:stackoverflow.com/a/44070743/225767
(感谢评论@uhbif19)
原始回答:
我个人会做的是为列表与细节设置不同的序列化程序。 ModelViewSet具有retrieve()
和retrieve()
方法。在下面的示例中,我覆盖了serializer_class
方法并将super()
属性设置为声明的"详细信息"串行器。当它调用list()
时,我们现在使用详细序列化器。 ItemListSerializer
将继续使用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)
创建自己的ModelViewSet类。
{{1}}