Skip to content

django-filter custom field extensions do not allow for serializer fields #1007

@realsuayip

Description

@realsuayip

Describe the bug

When specifying custom annotations for filters.Filter classes, only the basic types and raw openapi definitions are allowed:

if is_basic_type(annotation):
schema = build_basic_type(annotation)
else:
# allow injecting raw schema via @extend_schema_field decorator
schema = annotation.copy()

To Reproduce

from django_filters import rest_framework as filters

@extend_schema_field(serializers.CharField())
class CustomFilter(filters.Filter):
    field_class = django.forms.CharField

and use following filter in a view:

from django_filters import rest_framework as filters

class SomeFilter(filters.FilterSet):
    something = CustomFilter(required=True)
File "/usr/local/lib/python3.11/site-packages/drf_spectacular/contrib/django_filters.py", line 63, in get_schema_operation_parameters
result += self.resolve_filter_field(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/drf_spectacular/contrib/django_filters.py", line 100, in resolve_filter_field
schema = annotation.copy()
         ^^^^^^^^^^^^^^^
AttributeError: 'CharField' object has no attribute 'copy'

Expected behavior

I should be able to specify serializer fields in filter annotations.

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