【问题标题】:Add count objects in Django Rest Framework Viewset在 Django Rest Framework 视图集中添加计数对象
【发布时间】:2017-12-26 03:48:49
【问题描述】:

我有一个关于在 Django Rest Framework 视图集中添加计数对象的问题: 这是我当前的 API:

[
    {
        "id": 1,
        "created": "2017-12-25T10:29:13.055000Z"
    },
    {
        "id": 2,
        "created": "2017-12-25T10:29:13.055000Z"
    }
]

现在我想在这个 API 之外添加计数对象并将它们收集到 results 数组中,如下所示:

{
    "count_objects": 2,
    "results": [
        {
            "id": 1,
            "created": "2017-12-25T10:29:13.055000Z"
        },
        {
            "id": 2,
            "created": "2017-12-25T10:29:13.055000Z"
        }
    ]
  }

我怎样才能以正确的方式做到这一点?现在我的 viewset.py 是:

class NotificationAPIView(ReadOnlyModelViewSet):
    queryset = Notification.objects.all()
    serializer_class = NotificationSerializer

    def get_queryset(self, *args, **kwargs):
        queryset_list = Notification.objects.filter(to_user=self.request.user)
        return queryset_list

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    settings.py

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 100
    }
    

    你又来了,你真的应该在提问之前阅读doc

    更新:

    from collections import OrderedDict
    from rest_framework.response import Response
    
    class Pagination(PageNumberPagination):
        def paginate_queryset(self, queryset, request, view=None):
            self.count_objects = queryset.filter(id__gt=2).count()
            return super(Pagination, self).paginate_queryset(queryset, request, view=view)
    
        def get_paginated_response(self, data):
            return Response(OrderedDict([
                ('count_objects', self.count_objects),
                ('count', self.count),
                ('next', self.get_next_link()),
                ('previous', self.get_previous_link()),
                ('results', data)
            ]))
    
    
    class NotificationAPIView(ReadOnlyModelViewSet):
        queryset = Notification.objects.all()
        serializer_class = NotificationSerializer
        pagination_class = Pagination
    

    【讨论】:

    • 我知道分页。但我想添加更多对象来计算条件。例如,计算 id >2 的对象
    • 现在很忙,稍后会更新。这应该覆盖 get_paginated_response 方法
    • 查看更新,这是未经测试的代码,如果出现任何错误请告诉我。
    • annotate 可以在查询集中添加一个字段,但不能将字段返回到前面。如果你想要简单,只需将列表方法覆盖到自定义响应。
    • 继续问,总有一天你会的:)
    【解决方案2】:

    这将过滤值并在结果中为字段 status 添加计数。

    def count:
        Model.objects.filter(value=value).values('status').annotate(count=Count('status'))
    

    详情see documentation

    希望这会有所帮助。

    【讨论】:

    • 您将其作为单独的函数并调用该函数或在您现有的queryset_list = Notification.objects.filter(to_user=self.request.user).values('to_user').annotate(count=Count('to_user')) 中,因为 to_user 在所有使用该函数的行中都是通用的
    • SyntaxError: Non-ASCII character '\xe2' in file views.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 造成这个错误
    • 我不确定这个错误可能会帮助stackoverflow.com/questions/21639275/…
    【解决方案3】:

    serializers.py

    class YourSerializer(serializers.ModelSerializer)
    
        count = serializers.SerializerMethodField('get_count')
        class Meta:
             model = YourModel
             fields = ['...., count']
    
        def get_count(self, obj):    
            return YourModel.objects.all().count()
    

    【讨论】:

    • 您能详细说明一下吗?
    • 它将添加'count'字段作为响应并给出该模型中的数据总数
    猜你喜欢
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2016-09-30
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多