Django-filter: Peringatan Pengguna: X tidak kompatibel dengan pembuatan skema: karena Pengguna Anonim

Dibuat pada 13 Agu 2018  ·  4Komentar  ·  Sumber: carltongibson/django-filter

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

Komentar yang paling membantu

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(...)

Semua 4 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat