Метод вызова api и набор представлений

Я пытаюсь создать api вызов:

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all() 
    
    @action(methods=['get'], detail=False)
    def mainGgroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer_class()(mainGroups)
        
        return Response(serializer.data)

serializer:

class CategorySerializer(serializers.ModelSerializer):
    animals = AnimalSerializer(many=True)
    
    class Meta:
        model = Category
        fields = ['id','category_id','name', 'description', 'animals']

Итак, основной url работает: http://127.0.0.1:8000/djangoadmin/groups/

Но если я пойду на: http://127.0.0.1:8000/djangoadmin/groups/maingGroups/

Я получаю эту ошибку:


{
    "detail": "Not found."
}

urls.py:

router = routers.DefaultRouter()
router.register('groups', CategoryViewSet)   


urlpatterns = [
    path('', include(router.urls))
]

а urls.py из админки выглядит так:

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path("djangoadmin/", include('djangoadmin.urls')),
    path("admin/", admin.site.urls),   
    
]

Вопрос: как создать api метод в основном url?

Я думаю, что ваша проблема заключается в том, как вы инстанцируете свой класс сериализатора. Когда вы говорите:

    @action(methods=['get'], detail=False)
    def mainGroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer_class()(mainGroups)
        
        return Response(serializer.data)

Параметр many, если посмотреть на ваше сообщение об ошибке, похоже, по умолчанию принимает значение False, тогда как вы хотите сериализовать многие из этих объектов.

Я бы изменил инстанцирование на:

    @action(methods=['get'], detail=False)
    def mainGroups(self,request):        
        mainGroups = Category.objects.filter(category_id__isnull=True) 
        serializer = self.get_serializer_class(mainGroups, many=True)
        
        return Response(serializer.data)
Вернуться на верх