如何只在Django Serializers中显示值?

时间:2017-09-08 22:43:27

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

我正在使用' 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

2 个答案:

答案 0 :(得分:2)

以下是我要做的事情:因为你想要一个自定义序列化表单,我会实现一个自定义序列化器:

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

答案 1 :(得分:1)

您可以覆盖listmodelmixin提供的list方法:

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