Я снова смотрю на предупреждения пользователей, которые я пытался улучшить в https://github.com/carltongibson/django-filter/pull/903 :
…/django-filter/django_filters/rest_framework/backends.py:131: UserWarning: <class 'project.app.views.TermsOfServiceViewSet'> is not compatible with schema generation
"{} is not compatible with schema generation".format(view.__class__)
Это происходит в основном из-за того, что используется AnonymousUser, который несовместим с большинством методов get_queryset()
нашего представления, которые предполагают, что пользователь аутентифицирован (и, в частности, имеет определенные методы).
Я использую здесь drf_yasg.
Интересно, есть ли способ улучшить это, например, используя для этого аутентифицированного пользователя (возможно, это проблема drf-yasg).
Выслеживать:
../../../Vcs/django-rest-framework/rest_framework/views.py:480: in dispatch
response = handler(request, *args, **kwargs)
.venv/lib/python3.6/site-packages/drf_yasg/views.py:85: in get
schema = generator.get_schema(request, self.public)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:215: in get_schema
paths, prefix = self.get_paths(endpoints, components, request, public)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:337: in get_paths
operation = self.get_operation(view, path, prefix, method, components, request)
.venv/lib/python3.6/site-packages/drf_yasg/generators.py:379: in get_operation
operation = view_inspector.get_operation(operation_keys)
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/view.py:30: in get_operation
query = self.get_query_parameters()
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/view.py:293: in get_query_parameters
natural_parameters = self.get_filter_parameters() + self.get_pagination_parameters()
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/base.py:336: in get_filter_parameters
fields += self.probe_inspectors(self.filter_inspectors, 'get_filter_parameters', filter_backend()) or []
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/base.py:71: in probe_inspectors
result = method(obj, **kwargs)
.venv/lib/python3.6/site-packages/drf_yasg/inspectors/query.py:27: in get_filter_parameters
fields = filter_backend.get_schema_fields(self.view)
../../../Vcs/django-filter/django_filters/rest_framework/backends.py:131: in get_schema_fields
"{} is not compatible with schema generation".format(view.__class__)
E UserWarning: <class 'project.app.views.AffiliationViewSet'> is not compatible with schema generation
Не так много мы можем сделать здесь. Любой метод, требующий вызова get_queryset()
, столкнется с этим. Вам в основном нужно разрешить это для обработки анонимного случая.
В любом случае эту проблему лучше решить в рамках логики самоанализа DRF. (Но и здесь нет однозначного ответа.)
Одним из возможных обходных путей может быть определение чего-то подобного в методе get_queryset
вашего набора представлений. Обработка случая, когда self.request
равно None
похоже, помогает.
def get_queryset(self):
if self.request is None:
return SomeModel.objects.none()
return SomeModel.objects.filter(...)
Спасибо @gunthercox, ваш комментарий действительно помог мне. Это поставило меня на путь решения, но в конечном итоге у меня сработало следующее:
queryset = MyModel.objects.all()
def get_queryset(self):
if not self.request:
return MyModel.objects.none()
if self.request.query_params:
queryset = self.filter_queryset(self.queryset)
else:
queryset = self.queryset
# ... the rest of the method code ...
return queryset
Надеюсь, это поможет кому-то еще в подобной ситуации.
Я думаю, что предлагаемый подход таков:
def get_queryset(self):
if getattr(self, "swagger_fake_view", False):
return MyModel.objects.none()
# ... the rest of the method code ...
Я видел это в этой теме: https://github.com/axnsan12/drf-yasg/issues/333
Самый полезный комментарий
Одним из возможных обходных путей может быть определение чего-то подобного в методе
get_queryset
вашего набора представлений. Обработка случая, когдаself.request
равноNone
похоже, помогает.