Skip to content

AttributeError: 'ListSerializer' object has no attribute 'Meta' #404

@treussart

Description

@treussart

Describe the bug
I get this error:

Traceback (most recent call last):
  File "/Users/mtreussart/git/tt/scripts/../src/manage.py", line 21, in <module>
    main()
  File "/Users/mtreussart/git/tt/scripts/../src/manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/management/commands/spectacular.py", line 56, in handle
    schema = generator.get_schema(request=None, public=True)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/generators.py", line 243, in get_schema
    paths=self.parse(request, public),
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/generators.py", line 217, in parse
    operation = view.schema.get_operation(
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 84, in get_operation
    operation['responses'] = self._get_response_bodies()
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 997, in _get_response_bodies
    return {'200': self._get_response_for_code(response_serializers, '200')}
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 1042, in _get_response_for_code
    component = self.resolve_serializer(serializer, 'response')
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 1184, in resolve_serializer
    component.schema = self._map_serializer(serializer, direction)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 687, in _map_serializer
    schema = self._map_basic_serializer(serializer, direction)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 756, in _map_basic_serializer
    schema = self._map_serializer_field(field, direction)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 483, in _map_serializer_field
    schema = self._map_serializer_field(field.child, direction, collect_meta)
  File "/Users/mtreussart/.local/share/virtualenvs/back-JrD3H-kk/lib/python3.9/site-packages/drf_spectacular/openapi.py", line 653, in _map_serializer_field
    target = follow_field_source(field.parent.Meta.model, field.source_attrs)
AttributeError: 'ListSerializer' object has no attribute 'Meta'

To Reproduce
This is the problematic field:

groups = serializers.ListSerializer(
    source="all_groups", child=UserGroupField(), required=False, read_only=True
)

For fix the problem I patched openapi.py line 649:

        if isinstance(field, serializers.ReadOnlyField):
            # direct source from the serializer
            assert field.source_attrs, f'ReadOnlyField "{field}" needs a proper source'
            if hasattr(field.parent, "Meta"):
                target = follow_field_source(field.parent.Meta.model, field.source_attrs)
            else:
                if isinstance(field.parent, serializers.ListSerializer):
                     return append_meta(build_array_type(build_basic_type(OpenApiTypes.OBJECT)), meta)
            if callable(target):
                schema = self._map_response_type_hint(target)
            elif isinstance(target, models.Field):
                schema = self._map_model_field(target, direction)
            else:
                assert False, f'ReadOnlyField target "{field}" must be property or model field'
            return append_meta(schema, meta)

Expected behavior
No error. and understand my read-only serializer.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfix 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