【问题标题】:DetailApiViewset with classed based api view具有基于类的 api 视图的详细 Api 视图集
【发布时间】:2020-03-02 20:53:15
【问题描述】:

我正在尝试创建详细的 API 视图集,但现在,每当我转到“matches/api/matches/1/”时,我都找不到页面。 ListCreateAPIView 工作正常。

这是我的视图集:

class MatchViewset(viewsets.ViewSetMixin, generics.ListCreateAPIView):
    serializer_class = MatchSerializer

    def get_queryset(self):
        header_token = self.request.META.get('HTTP_AUTHORIZATION', None)
        print(header_token)
        if header_token is not None:
            try:
                token = sub('Token ', '', self.request.META.get('HTTP_AUTHORIZATION', None))
                token_obj = Token.objects.get(key=token)
                self.request.user = token_obj.user
            except Token.DoesNotExist:
                pass
        print(self.request.user)
        return Match.objects.filter(creator=self.request.user)


class MatchDetailViewset(generics.RetrieveUpdateDestroyAPIView):
    queryset = Match.objects.all()
    serializer_class = MatchSerializer

和路由器:

router = routers.DefaultRouter()
router.register(r'matches', matches_views.MatchViewset, base_name="matches")

和网址:

app_name = 'matches'

urlpatterns = [
    path('api/', include(router.urls)),
]

【问题讨论】:

    标签: python django django-rest-framework django-views django-class-based-views


    【解决方案1】:

    根据此处的文档:Routers usage

    router.register(r'matches', matches_views.MatchViewset, base_name="matches")之后你必须给

    urlpatterns = router.urls

    我想这会解决问题

    【讨论】:

    • 我在我的 urls 文件中使用了 include 函数,所以我猜不是这样。我刚刚添加到问题中。
    【解决方案2】:
    1. MatchDetailViewset 未在 urlpatterns 中注册,这就是您收到 404 错误的原因
    2. DRF 路由器似乎不支持注册多个具有相同前缀的视图集。 所以也许你应该尝试这样的事情:
    class MatchViewSet(viewsets.ModelViewSet):
        serializer_class = MatchSerializer
        queryset = Match.objects.all()
    
        def list(self, request, *args, **kwargs):
            header_token = self.request.META.get('HTTP_AUTHORIZATION', None)
            print(header_token)
            if header_token is not None:
                try:
                    token = sub('Token ', '', self.request.META.get('HTTP_AUTHORIZATION', None))
                    token_obj = Token.objects.get(key=token)
                    self.request.user = token_obj.user
                except Token.DoesNotExist:
                    pass
            print(self.request.user)
    
            # customize the queryset for listview
            queryset = self.get_queryset().filter(creator=self.request.user)
    
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    

    【讨论】:

      猜你喜欢
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 2012-08-10
      相关资源
      最近更新 更多