Django rest framework - вызов другого представления на основе классов - PullRequest
0 голосов
/ 03 июля 2018

Я рассмотрел несколько похожих постов (и Вызов представления на основе класса для приложения из другого приложения в том же проекте показался многообещающим, но не работает), но некоторые из них старше и ни один не совсем работает для меня. Вот мои настройки (используя Django == 2.0.6, djangorestframework == 3.8.2)

У меня есть базовая модель (здесь упрощенно):

from django.db import models
class Resource(models.Model):
    name = models.CharField(max_length=100, null=False)

У меня есть базовая конечная точка, где я могу перечислить и создать Resource экземпляров:

from rest_framework import generics, permissions
from myapp.models import Resource
from myapp.serializers import ResourceSerializer

class ListAndCreateResource(generics.ListCreateAPIView):
    queryset = Resource.objects.all()
    serializer_class = ResourceSerializer
    permission_classes = (permissions.IsAuthenticated,)

(afaik, подробности о сериализаторе не имеют значения, так что не указываются).

В любом случае, в дополнение к этой базовой конечной точке, у меня есть другая конечная точка API, которая выполняет некоторые действия, но также создает некоторые Resource объекты в процессе. Конечно, я хотел бы использовать функциональность, инкапсулированную в классе ListAndCreateResource, поэтому мне нужно поддерживать только одно место, где создаются Resource s.

Я пытался:

Попытка 1:

class SomeOtherView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # ... some other functionality...
        # ...
        response = ListAndCreateResource().post(request, *args, **kwargs)
        # ... more functionality...
        return Response({'message': 'ok'})

К сожалению, это не работает для меня. По моему следу я получаю:

  File "/home/projects/venv/lib/python3.5/site-packages/rest_framework/generics.py", line 111, in get_serializer
    kwargs['context'] = self.get_serializer_context()
  File "/home/projects/venv/lib/python3.5/site-packages/rest_framework/generics.py", line 137, in get_serializer_context
    'request': self.request,
AttributeError: 'ListAndCreateResource' object has no attribute 'request'

Попытка 2: Эта попытка пытается использовать метод as_view, который является частью всех представлений на основе классов Django:

class SomeOtherView(generics.CreateAPIView):
    def post(self, request, *args, **kwargs):
        # ... some other functionality...
        # ...
        response = ListAndCreateResource.as_view()(request, *args, **kwargs)
        # ... more functionality...
        return Response({'message': 'ok'})

Но от этого отказываются:

AssertionError: The `request` argument must be an instance of `django.http.HttpRequest`, not `rest_framework.request.Request`

Итак, мой вопрос ... есть ли простой способ сделать это? Я могу получить доступ к атрибуту _request объекта rest_framework.request.Request (который имеет тип django.http.HttpRequest, но тогда у меня нет каких-либо деталей аутентификации, которые содержатся в объекте DRF Request (действительно, мой * 1040) * возвращает 403, если я использую response = ListAndCreateResource().as_view()(request._request, *args, **kwargs) при попытке № 2 выше).

Заранее спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете получить доступ к request с помощью self.request в представлениях на основе классов.

...