代码之家  ›  专栏  ›  技术社区  ›  H C

如何在Django序列化程序中仅显示值?

  •  6
  • H C  · 技术社区  · 7 年前

    目前输出为:

    {
        "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',)
    

    看法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
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   spectras    7 年前

    以下是我将要做的:由于您希望为您的州创建一个自定义序列化表单,我将实现一个自定义序列化器:

    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 和列表的字符串列表 ). 如果还需要写支持,则需要重写 .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
  •  1
  •   Brown Bear    7 年前

    you 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))