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

Raf*_*nto 3 routing json django-rest-framework

有谁知道如何成功地以JSON格式检索模型的对象计数,以及如何配置路由?我正在尝试使用API​​View并返回由JSONRenderer格式化的Response。

更新:

@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)
Run Code Online (Sandbox Code Playgroud)

这是我使用的路线:

url(r'^influencias/count/$', views.InfluenciasCountView, name='influencias-count')
Run Code Online (Sandbox Code Playgroud)

Ade*_*laN 9

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

更新

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

url(r'^users/count/$', views. UserCountView.as_view(), name='users-count')
Run Code Online (Sandbox Code Playgroud)

然后,当您访问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)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ang 8

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

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

  1. 将 DRF 升级到 3.8.2(或更高版本)requirements.txt(或PipFile如果您使用它)。
  2. count向 ModelViewSet添加一个新的 action方法
  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)
Run Code Online (Sandbox Code Playgroud)
  • 查询帖子数: /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)
Run Code Online (Sandbox Code Playgroud)

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

class PostViewSet(viewsets.ModelViewSet, CountModelMixin):
Run Code Online (Sandbox Code Playgroud)

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