Я рассмотрел несколько похожих постов (и Вызов представления на основе класса для приложения из другого приложения в том же проекте показался многообещающим, но не работает), но некоторые из них старше и ни один не совсем работает для меня. Вот мои настройки (используя 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 выше).
Заранее спасибо!