Skip to content

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

@pd-Shah

Description

@pd-Shah

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfix confirmation pendingissue has been fixed and confirmation from issue reporter is pending

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions