Python Django自定义字典响应

Python Django自定义字典响应,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我正在使用Django rest框架,我有一个以字典格式返回信息的视图。 这是我的模型: class Child(models.Model): name = models.CharField(max_length=50, unique=True) age = models.IntegerField(null=False, blank=False) height = models.IntegerField(null=False, blank=False) 我想将以下响应作

我正在使用Django rest框架,我有一个以字典格式返回信息的视图。 这是我的模型:

class Child(models.Model):
    name = models.CharField(max_length=50, unique=True)
    age = models.IntegerField(null=False, blank=False)
    height = models.IntegerField(null=False, blank=False)
我想将以下响应作为dictionary返回,其中
name
字段是键:

{
    "Alice Allen": {
        "age": 3,
        "height": 98
    },
    "Bob Brady": {
        "age": 4,
        "height": 105
    }
}
我知道我可以使用GenericAPIView并在“get”方法中实现逻辑(获取数据并解析到字典中),但我想知道是否还有其他使用Django序列化器的解决方案


谢谢。

如果您使用的是viewset,您可以尝试覆盖
列表
方法并自定义响应:

class ChildViewSet(viewsets.ModelViewSet):

    def list(self, request, *args, **kwargs):
        response = super(ChildViewSet, self).list(request, *args, **kwargs)
        response.data = {result.pop('name'): result for result in response.data}
        return response

我建议您为您的模型实现一个序列化程序,并重写
to_representation
方法,并返回您希望模型的表示方式

范例

class ChildSerializer(serializers.ModelSerializer):

    class Meta:
        model = Child
        fields = '__all__'

    def to_representation(self, instance):
       # Here instance is instance of your model
       # so you can build your dict however you like
       result = OrderedDict()
       result[instance.name] = {"age" : instance.age, "height" : instance.height}
       return result

这是个问题,因为它不再是一本字典了。有了这个建议,我会得到:[{“爱丽丝”:“年龄”:3,“身高”:98},]

啊,对于这一点,我建议创建这样一个视图:

class DictView(generics.GenericAPIView):
    queryset = Domain.objects.all()

    def _get_serialized_items(self, input):
       result = OrderedDict()

        for item in input:
            result[item.name] = {"age" : item.age, "height" : item.height}

        return result

    def get(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)

        if page is not None:
            return self.get_paginated_response(self._get_serialized_items(page))

        return Response(self._get_serialized_items(queryset))

这是个问题,因为它不再是一本字典了。有了这个建议,我会得到:[{“Alice”:“age”:3,“height”:98},[@nirnah更新了我的答案,建议返回dict而不是列表,就像你喜欢的那样。虽然它不是一个真正的ModelViewSet,但它仍然有效。也感谢我。问题:我应该使用
ModelViewSet