Include choices params even for non editable fields#9929
Include choices params even for non editable fields#9929ticosax wants to merge 2 commits intoencode:mainfrom
Conversation
31c8854 to
758b6ec
Compare
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.
758b6ec to
fa16bbb
Compare
|
Please disregard my approval (I can't undo it apparently) I thought I was working on another repo. |
There was a problem hiding this comment.
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
choicesinget_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.
| non_editable_choice_field = serializer.get_fields()["non_editable_choice_field"] | ||
| assert isinstance(non_editable_choice_field, ChoiceField) | ||
|
|
||
|
|
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
please cross check this suggestion
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
choiceskwargs populating step, before the early return for non_editable fields.just before: