为什么Django rest api根不列出经典端点

2024-04-19 18:53:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经通过路由器注册了我的一些端点,并以经典风格编写了其他端点,所谓经典风格,我的意思是它们不是通过路由器注册的,而是直接写在path中。现在的问题是,api根目录只列出通过路由器注册的端点,我希望两者都列出

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/url.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'}))
]

Tags: fromimportselfactionsidgetobjectstype