【问题标题】:How to display only values in Django Serializers?如何仅在 Django 序列化程序中显示值?
【发布时间】:2018-02-17 21:45:38
【问题描述】:

我正在使用“rest_serializer”模块实现 Django REST API 框架:

目前的输出是:

{
    "count": 86,
    "next": "http://127.0.0.1:8000/state/?page=2",
    "previous": null,
    "results": [
        {
            "state_name": "Alaska"
        },
        {
            "state_name": "California"
        },
        ...
     ]
}

如何将其显示为 json 列表:

[
     "Alaska",
     "California",
     ...
]

下面是我的序列化器:

from .models import States
from rest_framework import serializers


class StateSerializer(serializers.ModelSerializer):
    class Meta:
        model = State
        fields = ('state_name',)

view.py

class StateViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = States.objects.values('state_name').distinct();
    serializer_class = StateSerializer

【问题讨论】:

    标签: django django-rest-framework django-serializer


    【解决方案1】:

    这是我要做的:因为您想要为您的状态定制序列化表单,我将实现一个自定义序列化器:

    class RawStateSerializer(serializers.BaseSerializer):
        def to_representation(self, obj):
            return obj.state_name
    

    然后就可以正常使用阅读了:

    class StateViewSet(viewsets.ModelViewSet):
        queryset = States.objects.values('state_name').distinct();
        serializer_class = RawStateSerializer
    

    注意它只支持读取(对于单个GET,它将只返回一个字符串,而对于列表GET,它将返回一个字符串列表)。如果你也想写支持,你需要重写.to_internal_value() 方法。

    最后,如果您只需要用于列出组的特殊序列化程序,而需要用于其他操作的常规序列化程序,您可以这样做(基于我的this answer):

    class StateViewSet(viewsets.ModelViewSet):
        queryset = States.objects.values('state_name').distinct();
    
        def get_serializer_class(self):
            if self.action == 'list':
                return RawStateSerializer
            return StateSerializer
    

    【讨论】:

      【解决方案2】:

      你 cam 覆盖 list 方法,由 listmodelmixin 提供:

      from rest_framework.response import Response
      
      class StateViewSet(viewsets.ModelViewSet):
          """
          API endpoint that allows groups to be viewed or edited.
          """
          queryset = States.objects.values('state_name').distinct();
          serializer_class = StateSerializer
      
          def list(self, request, *args, **kwargs):
              queryset = self.filter_queryset(self.get_queryset())
              return Response(queryset.values_list('state_name', flat=True))
      

      【讨论】:

      • 将导入添加到答案中
      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2016-12-15
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多