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()
๋ฅผ ํธ์ถํด์ผ ํ๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ช
์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ์ฉํด์ผ ํฉ๋๋ค.
์ด๋ ์ชฝ์ด๋ ๋ฌธ์ ๋ 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
๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํธ๋ฆญ์ ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค.