我正在使用Django Rest框架,并且我希望能够在返回单个对象时向序列化程序添加额外的细节,这将被排除在列表视图之外。
在下面的代码中,我将celery_state字段添加到TestModelSerializer,但我只希望在返回单个对象时添加该字段,而不是在返回TestModel数据列表时添加该字段。
我看过list_serializer_class选项,但它似乎只使用原始的模型序列化程序,所以即使我试图从那里排除,它仍然会包含该字段。
我有什么选择?
class TestModelSerializer(serializers.HyperlinkedModelSerializer):
celery_state = serializers.CharField(source='celery_state', read_only=True)
class Meta:
model = TestModel
class TestModelViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows TestModels to be viewed or edited.
"""
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticatedOrReadOnly,)
queryset = TestModel.objects.all()
serializer_class = TestModelSerializer发布于 2015-01-23 07:33:35
由于序列化程序类(由视图集使用)传递many参数,因此您可以使用它来控制字段输出:
class TestModelSerializer(serializers.HyperlinkedModelSerializer):
# ...
def __init__(self, *args, **kwargs):
super(TestModelSerializer, self).__init__(*args, **kwargs)
if kwargs.get('many', False):
self.fields.pop('celery_state')发布于 2017-02-07 21:48:52
灵感来自@mariodev的答案:
另一种可能是在序列化程序中覆盖many_init静态方法。根据本规范(https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py#L128 )中的注释,它是建议的变体。
from rest_framework import serializers
class ExtendedSerializer(serializers.Serializer):
...
@classmethod
def many_init(cls, *args, **kwargs):
kwargs['child'] = cls()
kwargs['child'].fields.pop('extractedFiled')
return serializers.ListSerializer(*args, **kwargs)发布于 2019-07-08 17:14:06
您可以有一个名为ExtendedTestModelSerializer的额外序列化程序,它将包含您想要的额外字段。
之后,您可以根据request.action使用get_serializer_class方法来决定使用哪个序列化程序-
class TestModelViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows TestModels to be viewed or edited.
"""
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticatedOrReadOnly,)
queryset = TestModel.objects.all()
# serializer_class = TestModelSerializer
get_serializer_class(self):
if self.request.action == 'list':
return TestModelSerializer
return ExtendedTestModelSerializerhttps://stackoverflow.com/questions/28087746
复制相似问题