Как я могу добавить представление, не возвращающее модель/запрос, с помощью django-restframework при использовании DjangoObjectPermissions?

У меня есть представление, что я хочу добавить к моей django-restframework api, которая не относится к какой-либо модели. Хотя я использую "rest_framework.permissions.DjangoObjectPermissions" в DEFAULT_PERMISSION_CLASSES.

class EnumChoices(views.APIView):       
    def get(self, request):
        enums = {}
        return Response(enums)

Теперь Django жалуется на мой взгляд:

AssertionError at /api/enums/
Cannot apply DjangoModelPermissions on a view that does not have `.queryset` property or overrides the `.get_queryset()` method.

Мне нужен класс разрешений почти для всех других видов и не хочу избавляться от него. Как обойти обязательные атрибуты для одного вида?

Ответ 1

Вы можете добавить логику разрешений для просмотра, чтобы перезаписать проверку разрешения модели. Создайте объект класса BasePermission и добавьте его в свой атрибут permission_classes. Не забудьте IsAuthenticated, если вы не хотите разрешать анонимным пользователям.

class EnumChoices(views.APIView):
    class EnumPermission(permissions.BasePermission):
        def has_permission(self, request, view):
            # whatever permission logic you need, e.g.
            return request.user.has_perm("planning.view_enums")
    permission_classes = (permissions.IsAuthenticated, EnumPermission)

    def get(self, request):
        enums = {}
        return Response(enums)

Теперь представление обеспечит аутентификацию пользователя и имеет разрешение view_enums.

Дополнительная информация здесь: http://www.django-rest-framework.org/api-guide/permissions/#custom-permissions