如何根据类别对结果进行分组?

2024-05-15 23:44:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个数据可视化API,在这里我需要使用ASerializer的结果,通过它们的给定标记,以便根据它们的关联标记将每个对象分类到类别中。如果对象包含两个标记,那么它应该同时显示在这两个标记中。e、 g

current output

{
   "count":117,
   "next":"http://localhost:8002/api/v1/demo/list/?page=2",
   "previous":null,
   "results":[
        {
            "_id": "T1189",
            "title": "promise",
            "tag": [
                "Demo",
                "Demo2"
            ],
            "queries": [],
        }
   ]
}


desired format 

[
    {
        "Demo": [
            {
                "_id": "T1189",
                "title": "promise",
                "tag": [
                    "Demo",
                    "Demo2"
                ],
                "queries": [],
            }
        ],
        "Demo2": [
            {
                "_id": "T1189",
                "title": "promise",
                "tag": [
                    "Demo",
                    "Demo2"
                ],
                "queries": [],
            }
        ],
    }
]

代码

# serializers
class TagSerializer(serializers.ModelSerializer):

    def to_representation(self, value):
        print(value)
        return value.name

    class Meta:
        model = Tag
        fields = ('name',)

class ASerializer(serializers.ModelSerializer):
    queries = QueriesSerializer(source='modelb_set', many=True)
    tag = TagSerializer(many=True)

    class Meta:
        model = ModelA
        fields = ('_id','title', 'tag','queries',)

class QueriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelB
        fields = '__all__'

#viewsets   
class BooksViewSet(mixins.ListModelMixin,
                      viewsets.GenericViewSet):

    queryset = ModelA.objects.all()
    serializer_class = ASerializer

Tags: 标记idtitlevaluedemotagmetaclass
1条回答
网友
1楼 · 发布于 2024-05-15 23:44:15

如果在数据库中TagsModelA之间存在反向关系,则可以对其执行一些子查询。但是,对我来说,在视图层中执行此srot的后期处理看起来非常简单:

class BooksViewSet(mixins.ListModelMixin,
                      viewsets.GenericViewSet):

    def get(self, *args, **kwargs):
        models = ASerializer(ModelA.objects.all(), many=True).data

        return_obj = {"Demo": [], "Demo2": []}

        for model in models:
            for key in  return_obj:
                if key in model["tag"]:
                    return_obj[key].append(model)

        return JsonResponse(return_obj)

相关问题 更多 >