Получите "detail": "not found" для подробного просмотра с Django Rest Framework - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь создать API, используя django rest Framework.Мне нужно одно представление, чтобы перечислить все элементы в datatable и другое представление, которое выводит данные для отдельного человека на основе их идентификатора.

Представление списка работает в 'api / bios /'.Тем не менее, я получаю следующую ошибку при добавлении идентификатора в URL:

HTTP 404 Не найдено Разрешить: GET, PUT, PATCH, DELETE, HEAD, OPTIONS Тип содержимого: application / json Зависит: Accept

{"detail": "Не найдено".}

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'

main / 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'),
]

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Рассматривали ли вы использовать Viewsets для этого API? DRF имеет мощный ViewSet, который выполняет все эти функции с минимальной конфигурацией. Например, это можно переписать как:

views.py

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

main urls.py

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

апи / urls.py

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

DRF сделает все остальное! Подробнее здесь: http://www.django -rest-framework.org / api-guide / viewsets /

0 голосов
/ 24 апреля 2018

Я предполагаю, что вам нужно удалить эту строку из вашего основного файла urls.py

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

Также измените ваш api/urls.py, чтобы включить регулярное выражение.Формат ?P<name>[regex].Предполагая, что trackmanid является целым числом, вам нужно добавить \d+ регулярное выражение рядом с ним.

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