Django Rest Framework - "详细信息":"未找到."

Dan*_*nny 15 django json mixins django-views django-rest-framework

您好,在执行此请求时:groups/25010a31-fc5b-47c8-9c5c-d740e5743f52/members/4/ - 我得到"详细信息":"未找到"

但是,如果您查看查询集,我已经打印了Groupmember实例,这最终打印出该特定实例,所以它显然存在?

视图:

class MemberDetail(mixins.RetrieveModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.UpdateModelMixin,
                   generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    lookup_field = "user_id"
    lookup_url_kwarg = "uuid"

    def get_queryset(self):
        group = self.kwargs["uuid"]
        user_id = self.kwargs["user_id"]
        print GroupMember.objects.get(group = group, user_id = user_id)
        return GroupMember.objects.get(group = group, user_id = user_id)

    def get(self, request, *args, **kwargs):
        return self.retrieve(self, request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(self, request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(self, request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

网址:

 urlpatterns = [

    url(r'^$', views.GroupList.as_view()),
    url(r'^(?P<uuid>[^/]+)/$', views.GroupDetail.as_view()),
    url(r'^(?P<uuid>[^/]+)/members/$', views.MemberList.as_view()),
    url(r'^(?P<uuid>[^/]+)/members/(?P<user_id>[0-9]+)/$', views.MemberDetail.as_view()),

] 
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

Rah*_*pta 12

首先,您需要在get_queryset()方法中返回一个queryset .

此外,您错误地定义lookup_url_kwarguuid.它实际应该是user_id这个url kwarg值用于uuid lookup_field在从get_queryset()方法返回的查询集中执行查找.

lookup_url_kwargif unset 的默认值与lookup_field.所以,我们不需要定义lookup_url_kwarg偶数.它将从中计算出来lookup_field.

class MemberDetail(mixins.RetrieveModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.UpdateModelMixin,
                   generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    lookup_field = "user_id" # no need to define 'lookup_url_kwarg' as both have same value

    def get_queryset(self):
        group = self.kwargs["uuid"]
        return GroupMember.objects.filter(group = group) # return a queryset
Run Code Online (Sandbox Code Playgroud)

在该get_queryset()方法中,我们只使用group而不是使用过滤器,user_id因为只要有retrieve请求,DRF本身就会执行此过滤.

使用.get()上一个QuerySet会返回一个对象,而不是一个查询集.要根据值执行过滤lookup_field,我们需要一个查询集.现在,.filter()返回一个查询集,所以我们在这里使用它.

注意:当您返回时GroupMember.objects.filter(group = group, user_id = user_id),retrieve尝试对该user_id字段上返回的查询集执行查找,其值为lookup_url_kwarg值ie user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52.由于该查询集中不存在此类对象,因此返回该错误.


小智 9

就我而言,在 routers.py 文件中我是这样写的

router.register(r'',PersonViewSet)
router.register(r'PersonEmployee',PersonEmployeeViewSet)
Run Code Online (Sandbox Code Playgroud)

所以我把它改为

router.register(r'PersonEmployee',PersonEmployeeViewSet)
router.register(r'',PersonViewSet)
Run Code Online (Sandbox Code Playgroud)

它首先读取空路径 URL 并抛出未找到的详细信息,所以我最后将路由器保留为空路径,并且工作正常。