Django-filter: UserWarning:Xはスキーマ生成と互換性がありません:AnonymousUserが原因です

作成日 2018年08月13日  ·  4コメント  ·  ソース: carltongibson/django-filter

https://github.com/carltongibson/django-filter/pull/903で強化しようとしたUserWarningsをもう一度見てい

…/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

最も参考になるコメント

考えられる回避策の1つは、ビューセットのget_querysetメソッドでこのようなものを定義することです。 self.requestNoneある場合を処理することで、うまくいくようです。

def get_queryset(self):
    if self.request is None:
        return SomeModel.objects.none()

    return SomeModel.objects.filter(...)

全てのコメント4件

ここでできることはあまりありません。 get_queryset()を呼び出す必要のあるメソッドは、これに遭遇します。 基本的に、匿名のケースを処理できるようにする必要があります。

いずれにせよ、この問題はDRFのイントロスペクションロジックの一部としてより適切に対処されます。 (しかし、そこにも簡単な答えはまだありません。)

考えられる回避策の1つは、ビューセットのget_querysetメソッドでこのようなものを定義することです。 self.requestNoneある場合を処理することで、うまくいくようです。

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

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

techdragon picture techdragon  ·  5コメント

edmorley picture edmorley  ·  3コメント

chromakey picture chromakey  ·  5コメント

csarcom picture csarcom  ·  3コメント

GuillaumeCisco picture GuillaumeCisco  ·  3コメント