Skip to content

Commit b69e4ad

Browse files
jkcgsagateblue
authored andcommitted
Fix PATCH call for ModelMultipleSerializer fields
This field is serialized as a list of model instances but the value is not handled correctly
1 parent a493397 commit b69e4ad

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

dynamic_preferences/serializers.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,14 @@ def to_db(self, value, **kwargs):
251251
# Support single instances in this serializer to allow
252252
# create_deletion_handler to work for model multiple choice preferences
253253
value = [value.pk]
254-
else:
254+
elif hasattr(value, 'values_list'):
255255
value = list(value.values_list("pk", flat=True))
256-
257-
if self.sort:
256+
elif isinstance(value, list) and len(value) > 0 and isinstance(value[0], self.model):
257+
# Handle lists of model instances
258+
value = [i.pk for i in value]
259+
else:
260+
raise ValueError(f'Cannot handle value {value} of type {type(value)}')
261+
if value and self.sort:
258262
value = sorted(value)
259263

260264
return self.separator.join(map(str, value))

tests/test_serializers.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,3 +335,24 @@ def test_model_multiple_single_serialization_with_non_int_pk(blog_entries):
335335
blog_entry = BlogEntryWithNonIntPk.objects.all().first()
336336

337337
assert s.serialize(blog_entry) == s.separator.join(map(str, [blog_entry.pk]))
338+
339+
340+
341+
def test_model_multiple_to_db_empty(blog_entries):
342+
result = serializers.ModelMultipleSerializer(BlogEntry).to_db([])
343+
assert result is None
344+
345+
346+
def test_model_multiple_to_db_multiple(blog_entries):
347+
entry1 = BlogEntry.objects.get(title="This is a test",)
348+
entry2 = BlogEntry.objects.get(title="This is only a test",)
349+
result = serializers.ModelMultipleSerializer(BlogEntry).to_db([
350+
entry1,
351+
entry2,
352+
])
353+
assert result == f'{entry1.pk},{entry2.pk}'
354+
355+
356+
def test_model_multiple_to_db_invalid(blog_entries):
357+
with pytest.raises(ValueError, match=r"Cannot handle value.* of type .*"):
358+
serializers.ModelMultipleSerializer(BlogEntry).to_db('invalid')

0 commit comments

Comments
 (0)