【问题标题】:Django Model ListAPIView serializer for counting objects用于计数对象的 Django 模型 ListAPIView 序列化程序
【发布时间】:2021-06-16 14:37:27
【问题描述】:

我有一个模型如下,实体:

class Entity(models.Model):
    uuid          = models.CharField(max_length=12, default=None)
    description   = models.CharField(max_length=255, default="")

我想为所有实体对象提供序列化,其中响应将提供数据库中可用的每种描述类型的计数。

例如,表格有以下内容:

1.cat 2.dog 3.cat 4.dog 5.bird 6.bird 7.dog

序列化将是:

狗:3 猫:2 鸟:2

我应该如何修改以下序列化程序代码来实现这一点?

#Entity Count(per Intelligence) Search
class EntityFilterSerializer(serializers.ModelSerializer):

    class Meta:
        model = Entity
        fields = ('description')

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 100

class EntityList(generics.ListAPIView):
    model = Entity
    serializer_class = EntityFilterSerializer
    filter_backends = [filters.SearchFilter]
    queryset = Entity.objects.order_by('id')
    search_fields = ['=uuid', ]
    pagination_class = StandardResultsSetPagination

【问题讨论】:

    标签: django django-models django-filter django-listview


    【解决方案1】:

    问题更多在于获取数据而不是序列化数据。由于您的示例响应中的键不固定,因此创建序列化程序将是有问题的,实际上不需要。您可能不需要为此视图进行分页。无论如何,这就是我的实现方式:

     class EntityList(generics.ListAPIView):
        model = Entity
        filter_backends = [filters.SearchFilter]
        search_fields = ['uuid']
    
        def list(self, request, *args, **kwargs):
            queryset = self.filter_queryset(self.get_queryset())
            description_counts = queryset.order_by().values('description').annotate(
                count=Count('*')
            )
            return Response({
                d['description']: d['count']
                for d in description_counts
            })
    

    如果您使用的是一个,它会破坏招摇,如果是这种情况,您将不得不提供“一些”serializer_class 来修复它。我更喜欢使用这种美感。您可以在文档字符串中编写实际响应的描述。

    class EmptySerializer(serializers.Serializer):
        pass
    

    或者,您可以决定更改响应的格式,这实际上是前端开发人员的首选。

    [{"description": "cat", "count": 5}, {"description": "dog", "count": 2}]
    

    对于这种格式,你可以很容易地描述一个序列化器

    class CountsSerializer(serializers.Serializer):
        description = serializers.CharField()
        count = serializers.IntegerField()
    
    class EntityList(generics.ListAPIView):
        model = Entity
        filter_backends = [filters.SearchFilter]
        serializer_class = CountsSerializer
    
        def list(self, request, *args, **kwargs):
            queryset = self.filter_queryset(self.get_queryset())
            description_counts = queryset.order_by().values('description').annotate(
                count=Count('*')
            )
            serializer = self.get_serializer(description_counts, many=True)
            return Response(serializer.data)
    

    【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2018-03-01
    • 2015-06-01
    • 2013-02-14
    • 2021-11-08
    • 2016-05-07
    • 1970-01-01
    • 2017-10-20
    • 2014-12-23
    相关资源
    最近更新 更多