【问题标题】:Receive "detail": "not found" for detail view with Django Rest Framework使用 Django Rest Framework 接收“详细信息”:“未找到”以获取详细信息视图
【发布时间】:2018-04-24 23:25:26
【问题描述】:

我正在尝试使用 django rest 框架创建一个 api。我需要一个视图来列出数据表中的所有项目,另一个视图根据他们的 id 为个人输出数据。

列表视图适用于“api/bios/”。但是,在向 url 添加 id 时收到以下错误:

HTTP 404 未找到 允许:GET、PUT、PATCH、DELETE、HEAD、OPTIONS 内容类型:应用程序/json 变化:接受

{ “详细信息”:“未找到。” }

views.py

from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics, mixins
from api.models import Playerbios
from api.serializers import USASerializer

class USAListView(mixins.CreateModelMixin, generics.ListAPIView):
    lookup_field = 'trackmanid'
    serializer_class = USASerializer

    def get_queryset(self):
        return Playerbios.objects.all()

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class USAView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'trackmanid'
    serializer_class = USASerializer

    def get_queryset(self):
        return Playerbios.objects.all()

serializers.py

from rest_framework import serializers
from api.models import Playerbios

class USASerializer(serializers.ModelSerializer):
    class Meta:
        model = Playerbios
        fields = '__all__'
        lookup_field = 'trackmanid'

ma​​in/urls.py

from django.contrib import admin
from django.urls import path, include
from api.views import USAView, USAListView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/bios/', include('api.urls')),
    path('api/bios/<trackmanid>/', include('api.urls')),
    path('accounts/', include('django.contrib.auth.urls')),
    path('', include('webapp.urls')),

]

api/urls.py

from django.conf.urls import url, include
from .views import USAView, USAListView

urlpatterns = [
    url('(?P<trackmanid>)/', USAView.as_view(), name='usa-rud-view'),
    url('', USAListView.as_view(), name='usa-list-view'),
]

【问题讨论】:

  • 在 api/urls.py 的 url 正则表达式的开头添加 ^(插入符号)和 $(美元符号)然后你的 url 应该是: url('^(?P )/$', USAView.as_view(), name='usa-rud-view'), url('^$', USAListView.as_view(), name='usa-list-view'),

标签: python json django api django-rest-framework


【解决方案1】:

您是否考虑过为此 API 使用 Viewsets? DRF 有一个强大的ViewSet,只需最少的配置即可执行所有这些功能。例如,这可以重写为:

views.py

class USAViewset(ModelViewSet):
    queryset = Playerbios.objects.all()
    serializer_class = USASerializer
    lookup_field = 'trackmanid'

主 urls.py

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

api/urls.py

urlpatterns = patterns(
    '',
)
router = DefaultRouter()
router.register(r'coupon', USAViewset)
urlpatterns += router.urls

DRF 将完成剩下的工作! 在这里阅读更多:http://www.django-rest-framework.org/api-guide/viewsets/

【讨论】:

  • 完美运行!而且比我之前的简单得多
【解决方案2】:

我的猜测是您需要从主 urls.py 文件中删除这一行

path('api/bios/<trackmanid>/', include('api.urls'))

还要更改您的api/urls.py 以包含正则表达式。格式为?P&lt;name&gt;[regex]。假设trackmanid 是一个整数,您需要在它旁边包含一个\d+ 正则表达式。

url('(?P<trackmanid>\d+)/', USAView.as_view(), name='usa-rud-view'),

【讨论】:

  • 我之前确实尝试过,但我仍然会收到同样的错误。但是,鉴于您的解释,我将保留它。
  • 这两项更改都应该可以解决问题。此外,在两个视图上都放置一个 pdb 以调试谁在为您的请求提供服务(如果有的话)。如果您开启了模板调试,请在此处分享错误堆栈跟踪以获得更多帮助。
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 2017-05-15
  • 2018-02-13
  • 2010-12-06
  • 1970-01-01
  • 2020-10-11
相关资源
最近更新 更多