Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

django_filters.py -> _get_model_field : AttributeError: 'NoneType' object has no attribute 'split' #519

Closed
pd-Shah opened this issue Sep 15, 2021 · 2 comments
Labels
enhancement New feature or request fix confirmation pending issue has been fixed and confirmation from issue reporter is pending

Comments

@pd-Shah
Copy link

pd-Shah commented Sep 15, 2021

Problem

In some cases filter_field.field_name is None. so there is an error:

Internal Server Error: /v1/schema/
Traceback (most recent call last):
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/views.py", line 67, in get
    return self._get_schema_response(request)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/views.py", line 74, in _get_schema_response
    return Response(generator.get_schema(request=request, public=self.serve_public))
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/generators.py", line 257, in get_schema
    paths=self.parse(request, public),
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/generators.py", line 231, in parse
    operation = view.schema.get_operation(
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/openapi.py", line 64, in get_operation
    parameters = self._get_parameters()
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/openapi.py", line 202, in _get_parameters
    **dict_helper(self._get_filter_parameters()),
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/openapi.py", line 377, in _get_filter_parameters
    parameters += filter_extension.get_schema_operation_parameters(self)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/contrib/django_filters.py", line 44, in get_schema_operation_parameters
    result += self.resolve_filter_field(
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/contrib/django_filters.py", line 80, in resolve_filter_field
    model_field = self._get_model_field(filter_field, model)
  File "/home/pd/Gits/coretrailer45/venv/lib64/python3.9/site-packages/drf_spectacular/contrib/django_filters.py", line 181, in _get_model_field
    path = filter_field.field_name.split('__')
AttributeError: 'NoneType' object has no attribute 'split'

for example I got this error by using django-property-filter. here is the code:

class Car(CommonModel):

    @property
    def price(self):
        return int(self.prices.last().title)


class CarFilter(PropertyFilterSet):
        property_fields = [
            ('price', PropertyNumberFilter, ['lt', 'exact']),
        ]

Solution

just check it before getting the attribute, filter_field.field_name is not None:, So:

    def _get_model_field(self, filter_field, model):
        if filter_field.field_name is not None:
            path = filter_field.field_name.split('__')
            return follow_field_source(model, path)
@tfranzel
Copy link
Owner

hi! that stacktrace is from an old version.

accounted for this non standard django-filter behavior. though you may still get warnings.

@tfranzel tfranzel added enhancement New feature or request fix confirmation pending issue has been fixed and confirmation from issue reporter is pending labels Sep 17, 2021
@tfranzel
Copy link
Owner

closing this issue for now. feel free to comment if anything is missing or not working and we will follow-up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request fix confirmation pending issue has been fixed and confirmation from issue reporter is pending
Projects
None yet
Development

No branches or pull requests

2 participants