Saya melihat UserWarnings yang saya coba tingkatkan di https://github.com/carltongibson/Django-filter/pull/903 lagi:
…/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__)
Itu terjadi sebagian besar karena AnonymousUser digunakan, yang tidak kompatibel dengan sebagian besar metode get_queryset()
tampilan kami, yang mengasumsikan bahwa pengguna diautentikasi (dan memiliki metode tertentu pada khususnya).
Saya menggunakan drf_yasg di sini.
Saya ingin tahu apakah ada cara untuk meningkatkan ini, misalnya dengan menggunakan pengguna yang diautentikasi untuk itu (mungkin akan menjadi masalah drf-yasg).
Melacak kembali:
../../../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
Tidak banyak yang bisa kita lakukan di sini . Metode apa pun yang perlu memanggil get_queryset()
akan mengalami ini. Anda pada dasarnya harus mengizinkannya untuk menangani kasus anonim.
Either way masalah ini lebih baik ditangani sebagai bagian dari logika introspeksi DRF. (Tapi belum ada jawaban sederhana di sana.)
Salah satu solusi yang mungkin adalah mendefinisikan sesuatu seperti ini dalam metode get_queryset
dari viewset Anda. Menangani kasus di mana self.request
adalah None
tampaknya berhasil.
def get_queryset(self):
if self.request is None:
return SomeModel.objects.none()
return SomeModel.objects.filter(...)
Terima kasih @gunthercox, komentar Anda sangat membantu saya. Itu menempatkan saya di jalan menuju solusi, tetapi pada akhirnya yang berhasil bagi saya adalah ini:
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
Semoga ini bisa membantu orang lain dalam situasi yang sama.
Saya pikir pendekatan yang disarankan adalah yang ini:
def get_queryset(self):
if getattr(self, "swagger_fake_view", False):
return MyModel.objects.none()
# ... the rest of the method code ...
Saya telah melihatnya di utas ini: https://github.com/axnsan12/drf-yasg/issues/333
Komentar yang paling membantu
Salah satu solusi yang mungkin adalah mendefinisikan sesuatu seperti ini dalam metode
get_queryset
dari viewset Anda. Menangani kasus di manaself.request
adalahNone
tampaknya berhasil.