Django Rest Framework:从模型中检索对象计数

时间:2014-08-06 03:04:37

标签: json routing django-rest-framework

有谁知道如何以JSON格式成功检索模型的对象数,以及如何配置路由?我试图使用API​​View实现此目的,并返回由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')

2 个答案:

答案 0 :(得分:5)

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

<强>更新

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

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

然后,当您访问网址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)

答案 1 :(得分:2)

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

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

  1. requirements.txt(或PipFile,如果您使用的话)将DRF升级到3.8.2(或更高版本)。
  2. 向ModelViewSet
  3. 添加新的操作count方法
  4. 更新get_permissions以包含新添加的操作count
  5. 这是我的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'添加到已授予操作的列表中。