Skip to content

Include choices params even for non editable fields#9929

Open
ticosax wants to merge 2 commits intoencode:mainfrom
ticosax:choices-read-only-fields
Open

Include choices params even for non editable fields#9929
ticosax wants to merge 2 commits intoencode:mainfrom
ticosax:choices-read-only-fields

Conversation

@ticosax
Copy link
Contributor

@ticosax ticosax commented Mar 24, 2026

The choices param can be usefull to populate list of possible values and to instantiate a ChoiceField on the serializer, even when the field is non_editable.

Relevant for the live doc and the OpenAPI integration.

Description

The fix consist into moving the choices kwargs populating step, before the early return for non_editable fields.
just before:

 if isinstance(model_field, models.AutoField) or not model_field.editable:
     kwargs['read_only'] = True
     return kwargs

@ticosax ticosax force-pushed the choices-read-only-fields branch from 31c8854 to 758b6ec Compare March 24, 2026 10:07
The choices param can be usefull to populate list of possible values
and to instantiate a ChoiceField on the serializer, even when field is non_editable.

Relevant for the live doc and the OpenAPI integration.
@ticosax ticosax force-pushed the choices-read-only-fields branch from 758b6ec to fa16bbb Compare March 24, 2026 10:31
@anoop-dryad
Copy link

Please disregard my approval (I can't undo it apparently) I thought I was working on another repo.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR ensures choices are included in generated serializer field kwargs even when the underlying Django model field is non-editable/read-only, enabling better OpenAPI/live-doc output (and consistent ChoiceField instantiation).

Changes:

  • Populate choices in get_field_kwargs() before the early return for non-editable fields.
  • Add a non-editable choice model field and a regression test to confirm it maps to a ChoiceField.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
rest_framework/utils/field_mapping.py Moves choices kwarg population earlier so read-only/non-editable fields still carry choices into serializer construction.
tests/test_model_serializer.py Adds a non-editable choice field to a test model and a test asserting it becomes a ChoiceField.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +374 to 377
non_editable_choice_field = serializer.get_fields()["non_editable_choice_field"]
assert isinstance(non_editable_choice_field, ChoiceField)


Copy link

Copilot AI Mar 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test bypasses the standard serializer.fields[...] access pattern used elsewhere in this file, and it only asserts the field class. Consider using serializer.fields['non_editable_choice_field'] (single quotes for consistency) and also asserting the field is read_only and that the expected choices are present, to fully lock in the behavior this PR is addressing.

Suggested change
non_editable_choice_field = serializer.get_fields()["non_editable_choice_field"]
assert isinstance(non_editable_choice_field, ChoiceField)
non_editable_choice_field = serializer.fields['non_editable_choice_field']
assert isinstance(non_editable_choice_field, ChoiceField)
assert non_editable_choice_field.read_only is True
model_field = ExampleSerializer.Meta.model._meta.get_field('non_editable_choice_field')
serializer_choice_keys = set(dict(non_editable_choice_field.choices).keys())
model_choice_keys = {choice[0] for choice in model_field.choices}
assert serializer_choice_keys == model_choice_keys

Copilot uses AI. Check for mistakes.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please cross check this suggestion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants