Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1544faf
respecting ordered sequence while partial update is fixed
Natgho Feb 25, 2026
4fdb19c
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
Natgho Mar 2, 2026
9caec6e
getting field order is re-ordered for backward compatibility
Natgho Mar 2, 2026
88ea74c
more detailed tests are added
Natgho Mar 2, 2026
0186c25
.idea is added for Pycharm tmp files
Natgho Mar 2, 2026
069c9fb
reduntant check is removed, respecting o(n) search, checking prefixed…
Natgho Mar 2, 2026
e1c8863
missing tests are added, more detailed
Natgho Mar 2, 2026
1206cc4
Update tests/test_serializer_lists.py
auvipy Mar 2, 2026
3bb0f16
Update tests/test_fields.py
Natgho Mar 2, 2026
12159c9
comment is fixed for current solution explanation
Natgho Mar 2, 2026
1457bbc
Update tests/test_serializer_lists.py
Natgho Mar 2, 2026
b0066ab
standardized the errors
Natgho Mar 2, 2026
acf688b
Update rest_framework/fields.py
Natgho Mar 2, 2026
733c207
listfield html input tests are seperated
Natgho Mar 2, 2026
471ce01
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
Natgho Mar 4, 2026
8afbbb2
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
auvipy Mar 4, 2026
5d20b80
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
Natgho Mar 10, 2026
b990481
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
Natgho Mar 27, 2026
dd44e4d
unnecessary AttributeError check part is removed
Natgho Mar 27, 2026
c96fd84
unnecessary try/except is removed, explanation parts are refactored
Natgho Mar 29, 2026
3191771
Reduce diff even more
browniebroke Mar 31, 2026
95b5934
Merge branch 'main' into 6202-partial-update-respect-ordered-sequence
auvipy Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -1675,17 +1675,25 @@ def __init__(self, **kwargs):
self.validators.append(MinLengthValidator(self.min_length, message=message))

def get_value(self, dictionary):
if self.field_name not in dictionary:
if getattr(self.root, 'partial', False):
return empty
# We override the default field access in order to support
# lists in HTML forms.
if html.is_html_input(dictionary):
val = dictionary.getlist(self.field_name, [])
if len(val) > 0:
# Support QueryDict lists in HTML input.
return val
return html.parse_html_list(dictionary, prefix=self.field_name, default=empty)
# Check for indexed keys like field_name[0], field_name[1], etc.
# before returning empty on partial updates
html_list = html.parse_html_list(dictionary, prefix=self.field_name, default=empty)
if html_list is not empty:
return html_list
# If no HTML list data found and this is a partial update, return empty
if getattr(self.root, 'partial', False):
return empty
return html_list
if self.field_name not in dictionary:
if getattr(self.root, 'partial', False):
return empty

return dictionary.get(self.field_name, empty)

Expand Down
22 changes: 22 additions & 0 deletions tests/test_serializer_lists.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,28 @@ class MultipleChoiceSerializer(serializers.Serializer):
assert serializer.validated_data == {}
assert serializer.errors == {}

def test_partial_listfield_with_indexed_keys(self):
"""
Test that ListField respects ordered sequence in form data with partial updates.
Regression test for GitHub issue where indexed keys like field[0], field[1]
were not being parsed in partial updates.
"""
class CommunitySerializer(serializers.Serializer):
colors = serializers.ListField(
allow_null=True,
child=serializers.CharField(label='Colors', max_length=7),
required=False
)
# Simulate form data with indexed keys
data = MultiValueDict({
'colors[0]': ['#ffffff'],
'colors[1]': ['#000000']
})
serializer = CommunitySerializer(data=data, partial=True)
assert serializer.is_valid(), f"Expected valid but got errors: {serializer.errors}"
Comment thread
Natgho marked this conversation as resolved.
Outdated
assert 'colors' in serializer.validated_data
assert serializer.validated_data['colors'] == ['#ffffff', '#000000']

Comment thread
auvipy marked this conversation as resolved.
Outdated
def test_allow_empty_true(self):
class ListSerializer(serializers.Serializer):
update_field = serializers.IntegerField()
Expand Down