Django GenericViewSet:无法创建自定义路由

时间:2019-06-06 04:06:41

标签: django python-3.x django-rest-framework

我正在努力了解基于类的通用视图如何在Django中工作。该文档没有详细介绍通用视图。 我已经创建了一个自定义@list_route,但似乎无法调用它。这是代码:

视图:

class AnalyticsViewSet(viewsets.GenericViewSet):
    queryset = models.BookingAnalytics.objects.exclude(status=booking_constants.BookingState.deleted)
    permission_classes = [DRYPermissions, ]
    filter_backends = [DjangoFilterBackend, ]
    filter_class = filters.AnalyticsFilter
    serializer_class = serializers.AnalyticsDetailSerializer
    serializer_classes = {}

    def list(self, request, *args, **kwargs):
        if not request.user.is_role_admin:
            raise exc.PermissionDenied()

        queryset = self.get_queryset()

        filtered_queryset = self.filter_queryset(queryset)

        data = {
            'stats': {
                ....
            }
        }

        return response.Ok(data)

    @list_route(methods=['POST'], url_path='export')
    def export(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        filtered_queryset = self.filter_queryset(queryset)

        recipients = []

        if 'recipients' in request.data:
            recipients = request.data['recipients']

        ....

        return response.NoContent()

型号:

class BookingAnalytics(UUIDModel, TimeStampedModel):
    ...

    class Meta:
        verbose_name = _('booking analytic')
        verbose_name_plural = _('booking analytics')
        ordering = ('-booking_date', '-created',)

    def __str__(self):
        return self.uuid

    @staticmethod
    @authenticated_users
    def has_read_permission(request) -> bool:
        return request.user.is_role_admin or request.user.is_role_client

    @staticmethod
    @authenticated_users
    def has_write_permission(request) -> bool:
        return request.user.is_role_admin or request.user.is_role_client

    @staticmethod
    @authenticated_users
    def has_object_list_permission(request) -> bool:
        return request.user.is_role_admin

    @authenticated_users
    def has_object_export_permission(self, request) -> bool:
        return request.user.is_role_admin

在这里,默认的list路由就可以了。但是,根本没有调用export路由。

我想念的是什么? enter image description here

enter image description here

与此相反,我还有另一个视图集,其中包含许多自定义路线,并且它们运行良好:

class BookingViewSet(
    MultipleSerializerMixin,
    mixins.CreateModelMixin,
    mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin,
    viewsets.GenericViewSet
):
    lookup_field = 'uuid'
    queryset = models.Booking.objects.all()
    permission_classes = [DRYPermissions, ]
    filter_backends = [filters.BookingFilterBackend, filters.BookingExportFilterBackend, DjangoFilterBackend, ]
    filter_class = filters.BookingFilter
    pagination_class = BookingViewSetPagination
    serializer_class = serializers.BookingDetailSerializer

    serializer_classes = {...}

    ....

    @list_route(methods=['POST'], url_path='export-bookings')
    def export_bookings(self, request, *args, **kwargs):
        queryset = self.get_queryset()
        filtered_queryset = self.filter_queryset(queryset)

        recipients = []

        if 'recipients' in request.data:
            recipients = request.data['recipients']

        ....

        return response.NoContent()

1 个答案:

答案 0 :(得分:0)

这就是我最终使它工作的方式。

views.py

@api_view(['POST'])
@permission_classes([permissions.IsAuthenticated])
def export(request, format=None):
    qs = models.BookingAnalytics.objects.all()

    filtered_queryset = filters.AnalyticsFilter(request.GET, queryset=qs)

    recipients = []

    if 'recipients' in request.data:
        recipients = request.data['recipients']
    ....

    return response.NoContent()

urls.py

...
    url(r'^export$', export, name='export'),
...