Skip to main content
 首页 » 编程设计

python之无法扩展 Django REST Framework View 集来处理多级 API

2024年08月25日30lovecherry

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

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

我似乎无法找到一种方法来扩展 View 集以处理除上述之外的以下 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 文档,但没有找到任何相关内容。

请您参考如下方法:

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

我的一个项目中使用这个库的示例代码

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/