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

最有用的评论

一种可能的解决方法可能是在视图集的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 内省逻辑的一部分得到更好的解决。 (但也没有一个简单的答案。)

一种可能的解决方法可能是在视图集的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 等级