首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django rest框架在不在列表视图中时添加字段

django rest框架在不在列表视图中时添加字段
EN

Stack Overflow用户
提问于 2015-01-22 19:32:59
回答 3查看 1.6K关注 0票数 6

我正在使用Django Rest框架,并且我希望能够在返回单个对象时向序列化程序添加额外的细节,这将被排除在列表视图之外。

在下面的代码中,我将celery_state字段添加到TestModelSerializer,但我只希望在返回单个对象时添加该字段,而不是在返回TestModel数据列表时添加该字段。

我看过list_serializer_class选项,但它似乎只使用原始的模型序列化程序,所以即使我试图从那里排除,它仍然会包含该字段。

我有什么选择?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2015-01-23 07:33:35

由于序列化程序类(由视图集使用)传递many参数,因此您可以使用它来控制字段输出:

代码语言:javascript
复制
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')
票数 4
EN

Stack Overflow用户

发布于 2017-02-07 21:48:52

灵感来自@mariodev的答案:

另一种可能是在序列化程序中覆盖many_init静态方法。根据本规范(https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py#L128 )中的注释,它是建议的变体。

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2019-07-08 17:14:06

您可以有一个名为ExtendedTestModelSerializer的额外序列化程序,它将包含您想要的额外字段。

之后,您可以根据request.action使用get_serializer_class方法来决定使用哪个序列化程序-

代码语言:javascript
复制
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 ExtendedTestModelSerializer
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28087746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档