أنا أنظر إلى UserWarnings الذي حاولت تحسينه في 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
يؤدي الغرض.