DjangoRestFramework组对象是由对象中的一个字段组成的?

时间:2016-01-26 04:47:50

标签: django django-rest-framework

如何通过对象中的字段对对象进行分组,以使具有该字段值相同的所有对象都在JSON的一个文件夹/图层/括号下?

例如,改变一下:

{
    "foo" : [
        {
            "type" : "letter",
            "value" : "x"
        },
        {
            "type" : "letter",
            "value" : "y"
        },
        {
            "type" : "letter",
            "value" : "z"
        },
        {
            "type" : "number",
            "value" : "1"
        },
        {
            "type" : "number",
            "value" : "0"
        }
    ]
}

对此:

{
    "bar" : {
        "letter" : ["x", "y", "z"],
        "number" : ["1", "0"]
    }
}

对于上下文,这里有一些我的代码归结为相关部分:

class TagSerializer(serializers.ModelSerializer):
    type = serializers.CharField(source='type.type')

    class Meta:
        model = Tag
        fields = ('tag', 'type')

class Tag(models.Model):
    type = models.ForeignKey('TagType', models.CASCADE, 'tags')
    tag = models.CharField(max_length=254, unique=True)

class TagType(models.Model):
    type = models.CharField(max_length=254, unique=True)

在伪代码中,我认为这是实现这一目标的第一步。如何在有或没有DRF的情况下实施?我把它放在哪里?

def TagTypeSerializer():
    types = TagType.objects.all()
    json = []
    for t in types:
        json += t.type
    return json

2 个答案:

答案 0 :(得分:1)

尽管可能,但您必须完全覆盖视图的list()方法:

class ListTags(generics.ListAPIView):
    def transform_result(self, data):
        """Your custom data transformations"""
        result = {'tags': set(), 'types': set()}
        for tag in data:
            result['tags'].update(data['tag'])
            result['types'].update(data['type'])
        return result

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

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(self.transform_result(serializer.data))

        serializer = self.get_serializer(queryset, many=True)
        return Response(self.transform_result(serializer.data))

答案 1 :(得分:-2)

Django REST框架序列化器不会那样工作。 您可能希望将自己的类推送到序列化/反序列化。