Почему django rest api root не перечисляет конечные точки classi c - PullRequest
0 голосов
/ 10 января 2020

Я зарегистрировал некоторые из моих конечных точек через маршрутизаторы и написал другие в стиле classi c, в стиле classi c. Я имею в виду, что они не зарегистрированы через маршрутизатор, а непосредственно записаны в path. Теперь проблема в том, что api root перечисляет только конечные точки, которые зарегистрированы через маршрутизатор, и я хочу, чтобы оба были перечислены.

app / views.py

from uuid import UUID

from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from event.models import Event
from event.serializers import EventSerializer
from food_album.models import FoodAlbums
from food_album.serializers import FoodAlbumsSerializer
from restaurant.models import RestaurantProfile
from restaurant.serializers import RestaurantProfileSerializer
from .serializers import *

customer_favourites = {
    0: [RestaurantProfile, RestaurantProfileSerializer],
    1: [Event, EventSerializer],
    2: [FoodAlbums, FoodAlbumsSerializer]
}


class CustomerProfileViewSet(viewsets.ModelViewSet):
    """
    A viewset that provides the standard actions
    """
    queryset = CustomerProfile.objects.all()
    serializer_class = CustomerProfileSerializer
    lookup_field = 'public_id'

    def get_serializer_class(self):
        if self.action in ['create', 'update']:
            return CustomerProfileCreateSerializer
        return self.serializer_class


class RewardTypesViewSet(viewsets.ModelViewSet):
    """
    A viewset that provides the standard actions
    """
    queryset = RewardTypes.objects.all()
    serializer_class = RewardTypesSerializer
    lookup_field = 'public_id'


class RewardActionsViewSet(viewsets.ModelViewSet):
    """
    A viewset that provides the standard actions
    """
    queryset = RewardActions.objects.all()
    serializer_class = RewardActionsSerializer
    lookup_field = 'public_id'


class ReportItemViewSet(viewsets.ModelViewSet):
    """
       A viewset that provides the standard actions
       """
    queryset = ReportItem.objects.all()
    serializer_class = ReportItemSerializer
    lookup_field = 'public_id'


class CustomerFavouritesViewSet(viewsets.ModelViewSet):
    """
       A viewset that provides the standard actions
       """

    serializer_class = CustomerFavouritesSerializer
    permission_classes = (IsAuthenticated,)
    lookup_field = 'public_id'

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

    def get_queryset(self):
        user = self.request.user
        if user.customer:
            return CustomerFavourites.objects.filter(customer=user.customer)
        else:
            return None


class UserFeedsViewSet(viewsets.ViewSet):
    """
    A viewset that provides the standard actions
    """
    serializer_class = RestaurantProfileSerializer

    def retrieve(self, request):
        r = RestaurantProfile.objects.all()
        serializer = RestaurantProfileSerializer(r, many=True)
        return Response(serializer.data)


class CustomerBookmarkViewSet(viewsets.ViewSet):
    """
    A viewset that provides the standard actions
    """

    permission_classes = (IsAuthenticated,)

    def list(self, request, reference_type):
        bookmarks = CustomerFavourites.objects.filter(type=0,
                                                      reference_type=reference_type).values_list(
            'reference_id', flat=True)
        public_ids = [UUID(id_) for id_ in bookmarks]
        r = customer_favourites.get(reference_type)[0].objects.filter(
            public_id__in=public_ids).all()
        serializer = customer_favourites.get(reference_type)[1](r, many=True)
        return Response(serializer.data)


class CustomerFavouriteViewSet(viewsets.ViewSet):
    """
    A viewset that provides the standard actions
    """
    permission_classes = (IsAuthenticated,)

    def list(self, request, reference_type):
        favs = CustomerFavourites.objects.filter(type=1,
                                                 reference_type=reference_type).values_list(
            'reference_id', flat=True)
        public_ids = [UUID(id_) for id_ in favs]
        r = customer_favourites.get(reference_type)[0].objects.filter(
            public_id__in=public_ids).all()
        serializer = customer_favourites.get(reference_type)[1](r, many=True)
        return Response(serializer.data)

app / urls.py

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

from . import views

router = DefaultRouter()
router.register(r'profile', views.CustomerProfileViewSet,
                base_name='profile')
router.register('reward-actions', views.RewardActionsViewSet, base_name='reward_actions')
router.register('reward-types', views.RewardTypesViewSet, base_name='reward_types')
router.register('report-item', views.ReportItemViewSet, base_name='report_item')
router.register('toggle-favourites', views.CustomerFavouritesViewSet, base_name='toggle_favourites')


urlpatterns = [
    path('customer/', include(router.urls)),
    path('customer/user-feeds/',
         views.UserFeedsViewSet.as_view({'get': 'retrieve'})),
    path('customer/favourites/<int:reference_type>/',
         views.CustomerFavouriteViewSet.as_view({'get': 'list'})),
    path('customer/bookmarks/<int:reference_type>/',
         views.CustomerBookmarkViewSet.as_view({'get': 'list'}))
]

1 Ответ

1 голос
/ 10 января 2020

Вам необходимо добавить router.urls в список существующих представлений как urlpatterns + = router.urls . Для получения дополнительной информации, пожалуйста, посмотрите - https://www.django-rest-framework.org/api-guide/routers/

...