无法扩展Django REST Framework视图集以处理多级API

比尔·诺布尔

我目前正在使用带有路由器和视图集的Django REST Framework来处理以下API调用:

/movie/
/movie/highlight
/movie/<id>/other

除了上述内容之外,我似乎找不到一种方法来扩展视图集以处理以下API调用:

/movie/<id>
/movie/<id>/other/<num>

我的views.py当前看起来像这样:

from django.contrib.auth.models import User, Group
from movies.models import Movie


from api.serializers import UserSerializer, GroupSerializer, MovieSerializer

from rest_framework.response import Response
from rest_framework import permissions
from rest_framework import renderers
from rest_framework import viewsets
from rest_framework.decorators import list_route, detail_route

class MovieViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Movie.objects.all().order_by('-title')
    serializer_class = MovieSerializer


    # Handle URL: /movie/highlight
    @list_route(renderer_classes=(renderers.StaticHTMLRenderer,))
    def highlight(self, request, *args, **kwargs):
        print "highlight"
        snippet = "Highlight"
        return Response(snippet)

    # Handle URL: /movie/<id>/other
    @detail_route(renderer_classes=(renderers.StaticHTMLRenderer,))
    def other(self, request, *args, **kwargs):
        print "highlight" + self.kwargs['pk']
        snippet = "Highlight" + self.kwargs['pk']
        return Response(snippet)

我的urls.py看起来像这样:

from django.conf.urls import url, include
from rest_framework import routers
from api import views

router = routers.DefaultRouter()
router.register(r'movie', views.MovieViewSet)		

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

我在上下搜索了如何执行此操作的示例,包括所有DRF文档,但没有找到任何相关的内容。

德米特里·谢梅诺夫(DmitrySemenov)

您需要使用此库来嵌套资源https://github.com/alanjds/drf-nested-routers

使用此lib的我的一个项目的示例代码

class NestedChatViewSet(
    viewsets.mixins.CreateModelMixin,
    viewsets.mixins.ListModelMixin,
    viewsets.GenericViewSet):

    queryset = Chat.objects.all()
    serializer_class = ChatSerializer
    permission_classes = (IsAuthenticated, IsUserVerified, IsUserSignedPrivacyAgreement, IsUserOfConsent, )

    def get_queryset(self):
        return Chat.objects.filter(consent=self.kwargs['consent_pk']).order_by('-created')

    def get_consent(self, request, pk=None):
        consent = get_object_or_404(Consent, pk=pk)
        self.check_object_permissions(self.request, consent)
        self.consent = consent
        return self.consent

    def create(self, request, *args, **kwargs):
        self.get_consent(request, pk=kwargs['consent_pk'])
        return super().create(request, *args, **kwargs)

    def perform_create(self, serializer):
        serializer.save(
            user=self.request.user,
            consent=self.consent
        )


    def list(self, request, *args, **kwargs):
        self.get_consent(request, pk=kwargs['consent_pk'])
        return super().list(request, *args, **kwargs)

然后在url.py中

router = DefaultRouter()
router.register(r'users', PeopleViewSet)
router.register(r'consents', ConsentViewSet)
consents_router = NestedSimpleRouter(router, r'consents', lookup='consent')
consents_router.register(r'chat', NestedChatViewSet)

现在您可以获得GET,POST同意/ ID /聊天,您可以在此处拥有无限数量的嵌套资源。

好的教程在这里http://www.machinalis.com/blog/nested-resources-with-django/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Django REST Framework:视图和视图集之间的区别?

Django Rest Framework - 单元测试视图集额外操作

Django Rest Framework视图集中的对象级别授权

如何在Django Rest Framework中动态更新视图集

Django rest框架无法处理模型视图集中的多个对象

用于视图集中视图的Django Rest Framework自定义架构

django rest框架-使用视图集

测试Django REST视图集的POST方法

PyCharm:调试Django Rest视图集

Django Rest Framework:在视图集中传递上下文

通用外键字段模型中的Django Rest Framework search_fields视图集

如何为 Django Rest Framework 中的视图集的自定义操作编写测试

如何使用Django Rest Framework视图集按父对象的属性过滤嵌套数据

django-rest-framework自定义视图集与多个查找参数检索

如何在Django Rest Framework的视图集中渲染为html

如何在Django Rest Framework中更改视图集检索响应?

分页不适用于Django rest_framework中的视图集

使用rest_framework_jwt在Django 3.0.3中从没有视图集的简单API调用获取用户对象

Django REST Framework的嵌套API视图?

Django Rest Framework具有针对同一对象的多个视图集和路由器

Django Rest Framework-在同一个视图集中返回不同的序列化器

Django Rest Framework 视图集 - 基于用户名问题的外键过滤过滤器

在Django Rest框架中使用视图集进行过滤

基于方法的Django Rest框架视图集权限

如何使用 django rest 视图集执行多次插入?

Django Rest Framework - 从现有视图定义 API

Django API(Rest Framework)中的单用户视图

无法访问Django REST视图

注册后Django Rest Framework无法登录