【问题标题】:Django Rest Framework: Retrieving object count from a modelDjango Rest Framework:从模型中检索对象计数
【发布时间】:2014-09-28 20:51:36
【问题描述】:

有谁知道如何以 JSON 格式成功检索模型的对象计数,以及我需要如何配置路由?我正在尝试使用 APIView 来实现此目的并返回由 JSONRenderer 格式化的响应。

更新:

@api_view(['GET'])
@renderer_classes((JSONRenderer, JSONPRenderer))
def InfluenciasCountView(request, format=None):
    influencia_count = Influencia.objects.count()
    content = {'influencia_count': influencia_count}
    return Response(content)

这是我使用的路线:

url(r'^influencias/count/$', views.InfluenciasCountView, name='influencias-count')

【问题讨论】:

    标签: json routing django-rest-framework


    【解决方案1】:

    查看this snippet of code(第二个)。如果这不适合您的需要,请添加一些代码(以便更好地理解)。

    更新

    对于路由,DRF 为每个视图提供default router。这意味着您可以在 urls.py 中进行以下配置:(使用上一个链接中的示例)

    url(r'^users/count/$', views. UserCountView.as_view(), name='users-count')
    

    然后,当您访问 URL your_base_url/users/count/ 时,您将看到类似 {'user_count': 10} 的内容。

    更新 2

    整个代码应该是这样的:

    class UserCountView(APIView):
        """
        A view that returns the count of active users.
        """
        renderer_classes = (JSONRenderer, )
    
        def get(self, request, format=None):
            user_count = User.objects.count()
            content = {'user_count': user_count}
            return Response(content)
    

    【讨论】:

    • AdelaN,这个 sn-p 是完美的。我试过完全使用这个。但无法为其编写正确的路线。你能帮帮我吗?
    • 嗨!它对我不起作用。我已经用我正在使用的代码更新了我上面的问题,所以你可以查看详细信息。基本上,当我尝试访问该路线时,我得到一个 404(未找到),如下所示:HTTP 404 NOT FOUND Content-Type: application/json Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS Vary: Accept { "detail": "Not found" }
    • 它没有用。除了使用 GenericAPIView 之外,我还应该做些什么不同的事情?
    • 是的,你应该改变方法签名
    • 我做到了。现在就像下面这样。路线有什么变化吗? @api_view(['GET']) @renderer_classes((JSONRenderer, JSONPRenderer)) def InfluenciasCountView(request, format=None): influencia_count = Influencia.objects.count() content = {'influencia_count': influencia_count} return Response(content)
    【解决方案2】:

    我正在使用来自 REST Framework 的 routers 来构建我的 URL。我尝试了上面的代码,但没有得到它的工作。问题之一是我无法让/count/ 进入路由器端点。

    我检查了 DRF 文档 (3.8.2),发现有一个(新的?)@action 装饰器(我使用的是 3.7.7,但它没有)。所以,这是我的完整解决方案:

    1. requirements.txt(或PipFile,如果您使用它)中将 DRF 升级到 3.8.2(或更高版本)。
    2. 向 ModelViewSet 添加一个新的操作 count 方法
    3. 更新get_permissions 以包含新添加的操作count

    这是我的views.py

    from rest_framework.decorators import action
    from rest_framework.response import Response
    
    class PostViewSet(viewsets.ModelViewSet):
        """
        API endpoint that allows recommend to be viewed or edited.
        """
        model = Post
        queryset = Post.objects.filter(is_active=True)
        serializer_class = serializers.PostSerializer
        filter_backends = (filters.SearchFilter, DjangoFilterBackend,)
        search_fields = ('title', 'body',)
        filter_fields = ('status', 'type')
    
        def get_permissions(self):
            if self.action in ('list', 'retrieve', 'create', 'count'):
                return (AllowAny()),
            if self.action in ('update', 'partial_update'):
                return (IsAdminUser()),
            return (IsAdminUser()),
    
        @action(detail=False)
        def count(self, request):
            queryset = self.filter_queryset(self.get_queryset())
            count = queryset.count()
            content = {'count': count}
            return Response(content)
    
    • 查询发帖数:/api/posts/count/?format=json
    • 要查询已发布的计数:/api/posts/count/?format=json&status=published

    这里重要的一点是使用来自filter_queryset(...) 的查询集,而不是Post.objects.all()

    更新

    由于count 很常见,我为此创建了一个mixin。

    from rest_framework.decorators import action
    from rest_framework.response import Response
    
    class CountModelMixin(object):
        """
        Count a queryset.
        """
        @action(detail=False)
        def count(self, request, *args, **kwargs):
            queryset = self.filter_queryset(self.get_queryset())
            content = {'count': queryset.count()}
            return Response(content)
    

    要使用它,只需将 CountModelMixin 添加到您的 ModelViewSet(也支持嵌套 ModelViewSet)。

    class PostViewSet(viewsets.ModelViewSet, CountModelMixin):
    

    如果您使用权限,还将'count' 添加到授予操作的列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 2021-08-19
      • 2013-11-11
      • 1970-01-01
      相关资源
      最近更新 更多