Django Rest Framework - “详细信息”:“未找到。”

时间:2015-10-27 16:55:44

标签: json django django-views django-rest-framework mixins

您在执行此请求时嗨: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)

网址:

 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()),

] 

任何帮助?

4 个答案:

答案 0 :(得分:10)

首先,您需要在get_queryset()方法中返回一个查询集。

此外,您错误地将lookup_url_kwarg定义为uuid。它应该是user_id,因为此url kwarg值用于在uuid方法返回的查询集中执行lookup_field get_queryset()的查找。

如果取消设置,lookup_url_kwarg的默认值与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

get_queryset()方法中,我们只使用group而非user_id进行过滤,因为只要有retrieve请求,DRF就会执行此操作。< / p>

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

注意:当您返回GroupMember.objects.filter(group = group, user_id = user_id)时,retrieve尝试在user_id字段上对此返回的查询集执行查找,其值为{{1}值lookup_url_kwarg。由于该查询集中不存在此类对象,因此返回该错误。

答案 1 :(得分:1)

通常,在安装Django rest框架数据表时会出现此错误,请在您的设置中检查Rest框架的配置中的下一个值:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
        'rest_framework_datatables.renderers.DatatablesRenderer',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework_datatables.filters.DatatablesFilterBackend',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework_datatables.pagination.DatatablesPageNumberPagination',
    'PAGE_SIZE': 50,
    'EXCEPTION_HANDLER': 'utils.rest_framework.views.exception_handler'
}

答案 2 :(得分:0)

只想添加。如果我正在查看queryset并没有返回带有期望对象的查询集,那么就您的问题的变化而言:

class MemberDetail(generics.GenericAPIView):
    serializer_class = GroupMembersSerializer
    queryset = GroupMember.objects.filter(...)

更改为:

queryset = GroupMember.objects.all()

答案 3 :(得分:0)

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

router.register(r'',PersonViewSet)
router.register(r'PersonEmployee',PersonEmployeeViewSet)

所以我将其更改为

router.register(r'PersonEmployee',PersonEmployeeViewSet)
router.register(r'',PersonViewSet)

它是先读取空路径URL并没有找到详细信息,因此我保留了路由器最后的空路径,并且运行良好。