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.request ๊ฐ€ None ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def get_queryset(self):
    if self.request is None:
        return SomeModel.objects.none()

    return SomeModel.objects.filter(...)

๋ชจ๋“  4 ๋Œ“๊ธ€

์—ฌ๊ธฐ์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 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

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰