Корень api Django REST framework пуст

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я настроил проект Django REST framework, но корень api не был заполнен ничем, например, набором просмотров пользователей, и я не могу получить доступ к ожидаемому URL-адресу со списком пользователей.

Существует одно приложение users с пользовательской моделью пользователя. (и проект django называется api)

главная urls.py

 from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('users.urls')),
]
 

пользовательское приложение urls.py

 from django.contrib import admin
from django.urls import include, path
from rest_framework.routers import DefaultRouter

from users.views import CustomUserViewSet

router = DefaultRouter()
router.register("users", CustomUserViewSet, 'users')

urlpatterns = [
]

urlpatterns  = router.urls
 

пользователи models.py

 from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

    def __str__(self):
        return self.username
 

пользователи serialisers.py

 from rest_framework.serializers import ModelSerializer
from .models import CustomUser


class CustomUserSerializer(ModelSerializer):
    class Meta:
        model = CustomUser
        fields = '__all__'
 

пользовательское приложение views.py

 from django.shortcuts import render
from rest_framework.viewsets import ViewSet
from .serializers import CustomUserSerializer
from .models import CustomUser


class CustomUserViewSet(ViewSet):
    serializer_class = CustomUserSerializer
    queryset = CustomUser.objects.all(
 

И пустой корень api в localhost:8000/api/
введите описание изображения здесь

и ошибка 404 в localhost:8000/api/users/
введите описание изображения здесь

Ответ №1:

Если вы используете just Viewset , вам необходимо выполнить действия.

Из документации:

Класс ViewSet не предоставляет никаких реализаций действий. Чтобы использовать класс ViewSet, вы переопределите класс и явно определите реализации действий

Вы можете добавить list действие, как в примере:

 from rest_framework.response import Response
class CustomUserViewSet(ViewSet):
    serializer_class = CustomUserSerializer
    queryset = CustomUser.objects.all()

    def list(self, request):
        queryset = CustomUser.objects.all()
        serializer = CustomUserSerializer(queryset, many=True)
        return Response(serializer.data)
 

Или (может быть, то, что вы ищете), используя что-то вроде ModelViewSet, который уже включает реализации для различных действий:

 class CustomUserViewSet(viewsets.ModelViewSet):
    serializer_class = CustomUserSerializer
    queryset = CustomUser.objects.all()
 

Комментарии:

1. Спасибо, что это была глупая ошибка ModelViewSet, которую я хотел ввести. Спасибо.

Ответ №2:

В вашем случае вам нужно просто заменить

class CustomUserViewSet(ViewSet):

с

class CustomUserViewSet(viewsets.ModelViewSet):