教程5:关系和超链接API错误 教程链接地址为:https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ 我尝试了与查询相关的解决方案,并且在stackoverflow上遇到了类似的问题,但是经过测试,我仍然无法使用它们。
views.py
class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
class SnippetDetail(generics.RetrieveDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'users': reverse('user-list', request=request, format=format),
'snippets': reverse('snippet-list', request=request, format=format),
})
class SnippetHighlight(generics.GenericAPIView):
queryset = Snippet.objects.all()
renderer_classes = [renderers.StaticHTMLRenderer]
def get(self, request, *args, **kwargs):
snippet = self.get_object()
return Response(snippet.highlighted)
urls.py
urlpatterns = format_suffix_patterns([
path('', views.api_root),
path('snippets/', views.SnippetList.as_view(), name='snippet-list'),
path('snippets/<int:pk>/', views.SnippetDetail.as_view(), name='snippet-detail'),
path('snippets/<int:pk>/highlight/', views.SnippetHighlight.as_view(), name='snippet-highlight'),
path('users/', views.UserList.as_view(), name='user-list'),
path('users/<int:pk>/', views.UserDetail.as_view(), name='user-detail'),
])
urlpatterns += [
path(r'api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
serializers.py
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')
class Meta:
model = Snippet
fields = ['url', 'id', 'highlight', 'owner',
'title', 'code', 'linenos', 'language', 'style']
class UserSerializer(serializers.HyperlinkedModelSerializer):
snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)
class Meta:
model = User
fields = ['url', 'id', 'username', 'snippets']
跟踪错误:
Traceback:
File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request)
File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)
File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Anaconda3\envs\python36\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view 54. return view_func(*args, **kwargs)
File "C:\Anaconda3\envs\python36\lib\site-packages\django\views\generic\base.py" in view 68. return self.dispatch(request, *args, **kwargs)
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in dispatch 505. response = self.handle_exception(exc)
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in handle_exception 465. self.raise_uncaught_exception(exc)
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in raise_uncaught_exception 476. raise exc
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in dispatch 502. response = handler(request, *args, **kwargs)
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\decorators.py" in handler 50. return func(*args, **kwargs)
File "C:\Users\Ze Ran Lu\Desktop\swie\text\tutorials\snippets\views.py" in api_root 205. 'users': reverse('user-list'),
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\reverse.py" in reverse 47. url = _reverse(viewname, args, kwargs, request, format, **extra)
File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\reverse.py" in _reverse 60. url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)
File "C:\Anaconda3\envs\python36\lib\site-packages\django\urls\base.py" in reverse 90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "C:\Anaconda3\envs\python36\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix 622. raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at / Exception Value: Reverse for 'user-list' not found. 'user-list' is not a valid view function or pattern name.
答案 0 :(得分:0)
reverse只接受以下参数:
reverse(viewname,urlconf = None,args = None,kwargs = None, current_app =无)
并且您的users/
不接受任何参数,因此您只需要反向输入网址名称
reverse('user-list')
答案 1 :(得分:0)
内部服务器错误:/ 追溯(最近一次通话): 内部文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ exception.py”,第34行 响应= get_response(请求) _get_response中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ base.py”,第126行 响应= self.process_exception_by_middleware(e,请求) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ base.py”,第124行,_get_response 响应= wraped_callback(请求,* callback_args,** callback_kwargs) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ views \ decorators \ csrf.py”,第54行,在wrapped_view中 返回view_func(* args,** kwargs) 视图中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ views \ generic \ base.py”,行68 返回self.dispatch(request,* args,** kwargs) 在分派中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第505行 响应= self.handle_exception(exc) 在handle_exception中的第465行,文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py” self.raise_uncaught_exception(exc) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第476行,raise_uncaught_exception 提高经验 派发文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第502行 响应=处理程序(请求,* args,** kwargs) 处理程序中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ decorators.py”,第50行 return func(* args,** kwargs) 文件“ C:\ Users \ Ze Ran Lu \ Desktop \ swie \ text \ tutorials \ snippets \ views.py”,第205行,位于api_root中 '用户':反向('用户列表'), 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ reverse.py”,第47行,反过来 url = _reverse(viewname,args,kwargs,request,format,** extra) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ reverse.py”,第60行,_reverse url = django_reverse(viewname,args = args,kwargs = kwargs,** extra) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ urls \ base.py”,第90行,反过来 返回iri_to_uri(resolver._reverse_with_prefix(视图,前缀,* args,** kwargs)) 文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ urls \ resolvers.py”,第622行,_reverse_with_prefix 提高NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch:找不到“用户列表”的反向。 “用户列表”不是有效的视图函数或模式名称。
答案 2 :(得分:0)
from django.contrib import admin
from django.urls import path
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('snippets.urls'))
]
答案 3 :(得分:0)
项目结构
教程 | _片段 | | _urls.py | | _views.py | | _models.py | | _apps.py | | _admin.py | _教程 | _urls.py | _settings.py | _wsgi.py