Django Rest 框架 - "detail":"Not found."
Django Rest Framework - "detail": "Not found."
您好,在执行此请求时:groups/25010a31-fc5b-47c8-9c5c-d740e5743f52/members/4/ - 我得到 "detail":"Not found"
但是,如果您查看查询集,我已经打印了 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()),
]
有什么帮助吗?
首先,您需要在 get_queryset()
方法中 return 一个查询集。
此外,您错误地将 lookup_url_kwarg
定义为 uuid
。它实际上应该是 user_id
,因为这个 url kwarg
值用于在查询集 return 中查找 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 本身执行.
在查询集上使用 .get()
将 return 一个对象而不是查询集。要根据 lookup_field
的值执行过滤,我们需要一个查询集。现在,.filter()
return 是一个查询集,所以我们在这里使用它。
注意: 当您 returned GroupMember.objects.filter(group = group, user_id = user_id)
时,retrieve
试图在这个 returned 查询集上执行查找在 user_id
字段上,其值为 lookup_url_kwarg
值,即 user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52
。由于该查询集中不存在此类对象,因此 return 编辑了该错误。
只是想补充一下。如果我正在查看 queryset
没有返回带有预期对象的查询集,那么就您的问题的变化而言:
class MemberDetail(generics.GenericAPIView):
serializer_class = GroupMembersSerializer
queryset = GroupMember.objects.filter(...)
更改为:
queryset = GroupMember.objects.all()
通常在您安装 Django rest framework datatables 时出现此错误,请检查您设置中 Rest Framework 配置的下一个值:
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'
}
在我的 routers.py 文件中,我是这样写的
router.register(r'',PersonViewSet)
router.register(r'PersonEmployee',PersonEmployeeViewSet)
所以我改成了
router.register(r'PersonEmployee',PersonEmployeeViewSet)
router.register(r'',PersonViewSet)
它首先读取空路径 URL 并抛出未找到详细信息,所以我最后将路由器保留为空路径并且它工作正常。
您好,在执行此请求时:groups/25010a31-fc5b-47c8-9c5c-d740e5743f52/members/4/ - 我得到 "detail":"Not found"
但是,如果您查看查询集,我已经打印了 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()),
]
有什么帮助吗?
首先,您需要在 get_queryset()
方法中 return 一个查询集。
此外,您错误地将 lookup_url_kwarg
定义为 uuid
。它实际上应该是 user_id
,因为这个 url kwarg
值用于在查询集 return 中查找 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 本身执行.
在查询集上使用 .get()
将 return 一个对象而不是查询集。要根据 lookup_field
的值执行过滤,我们需要一个查询集。现在,.filter()
return 是一个查询集,所以我们在这里使用它。
注意: 当您 returned GroupMember.objects.filter(group = group, user_id = user_id)
时,retrieve
试图在这个 returned 查询集上执行查找在 user_id
字段上,其值为 lookup_url_kwarg
值,即 user_id=25010a31-fc5b-47c8-9c5c-d740e5743f52
。由于该查询集中不存在此类对象,因此 return 编辑了该错误。
只是想补充一下。如果我正在查看 queryset
没有返回带有预期对象的查询集,那么就您的问题的变化而言:
class MemberDetail(generics.GenericAPIView):
serializer_class = GroupMembersSerializer
queryset = GroupMember.objects.filter(...)
更改为:
queryset = GroupMember.objects.all()
通常在您安装 Django rest framework datatables 时出现此错误,请检查您设置中 Rest Framework 配置的下一个值:
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'
}
在我的 routers.py 文件中,我是这样写的
router.register(r'',PersonViewSet)
router.register(r'PersonEmployee',PersonEmployeeViewSet)
所以我改成了
router.register(r'PersonEmployee',PersonEmployeeViewSet)
router.register(r'',PersonViewSet)
它首先读取空路径 URL 并抛出未找到详细信息,所以我最后将路由器保留为空路径并且它工作正常。