Skip to content

Commit d2dce5d

Browse files
authored
Handle serialization for non interger primary key in ModelMultipleSerializer (#268)
* Handle serialization for non interger primary key in ModelMultipleSerializer * Added test cases for non int pk deserialization
1 parent cff4cea commit d2dce5d

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

dynamic_preferences/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ def to_python(self, value, **kwargs):
248248

249249
try:
250250
pks = value.split(",")
251-
pks = [int(i) for i in pks]
252-
return self.model.objects.filter(pk__in=pks)
251+
pks = [int(i) if str(i).isdigit() else str(i) for i in pks]
252+
return self.model.objects.filter(pk__in=pks)
253253
except:
254254
raise self.exception("Array {0} cannot be converted to int".format(value))
255255

tests/test_app/models.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
import uuid
12
from django.db import models
23

34
class BlogEntry(models.Model):
45
title = models.CharField(max_length=255)
56
content = models.TextField()
7+
8+
9+
class BlogEntryWithNonIntPk(models.Model):
10+
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
11+
title = models.CharField(max_length=255)
12+
content = models.TextField()

tests/test_serializers.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.template import defaultfilters
77

88
from dynamic_preferences import serializers
9-
from .test_app.models import BlogEntry
9+
from .test_app.models import BlogEntry, BlogEntryWithNonIntPk
1010

1111

1212
class TestSerializers(TestCase):
@@ -169,7 +169,7 @@ def test_date_deserialization(self):
169169

170170
with self.assertRaises(s.exception):
171171
s.deserialize('Invalid date string')
172-
172+
173173
def test_datetime_serialization(self):
174174
s = serializers.DateTimeSerializer
175175

@@ -239,6 +239,11 @@ def setUp(self):
239239
BlogEntry(title='This is a test', content='Hello World'),
240240
BlogEntry(title='This is only a test', content='Hello World'),
241241
])
242+
BlogEntryWithNonIntPk.objects.bulk_create([
243+
BlogEntryWithNonIntPk(title='This is a test', content='Hello World'),
244+
BlogEntryWithNonIntPk(title='This is only a test', content='Hello World'),
245+
246+
])
242247

243248
def test_model_multiple_serialization(self):
244249
s = serializers.ModelMultipleSerializer(BlogEntry)
@@ -250,11 +255,32 @@ def test_model_multiple_deserialization(self):
250255
s = serializers.ModelMultipleSerializer(BlogEntry)
251256
blog_entries = BlogEntry.objects.all()
252257
pks = s.separator.join(map(str, sorted(list(blog_entries.values_list('pk', flat=True)))))
253-
254258
self.assertEqual(list(s.deserialize(pks)), list(blog_entries))
255259

256260
def test_model_multiple_single_serialization(self):
257261
s = serializers.ModelMultipleSerializer(BlogEntry)
258262
blog_entry = BlogEntry.objects.all().first()
259263

260264
self.assertEqual(s.serialize(blog_entry), s.separator.join(map(str, [blog_entry.pk])))
265+
266+
267+
def test_model_multiple_serialization_with_non_int_pk(self):
268+
s = serializers.ModelMultipleSerializer(BlogEntryWithNonIntPk)
269+
blog_entries = BlogEntryWithNonIntPk.objects.all()
270+
271+
self.assertEqual(s.serialize(blog_entries), s.separator.join(map(str, sorted(list(blog_entries.values_list('pk', flat=True))))))
272+
273+
def test_model_multiple_deserialization_with_non_int_pk(self):
274+
s = serializers.ModelMultipleSerializer(BlogEntryWithNonIntPk)
275+
blog_entries = BlogEntryWithNonIntPk.objects.all()
276+
pks = s.separator.join(map(str, sorted(list(blog_entries.values_list('pk', flat=True)))))
277+
278+
deserialized_ids = sorted([instance.pk for instance in s.deserialize(pks)])
279+
blog_entries_ids = sorted([entry.pk for entry in blog_entries])
280+
self.assertEqual(deserialized_ids, blog_entries_ids)
281+
282+
def test_model_multiple_single_serialization_with_non_int_pk(self):
283+
s = serializers.ModelMultipleSerializer(BlogEntryWithNonIntPk)
284+
blog_entry = BlogEntryWithNonIntPk.objects.all().first()
285+
286+
self.assertEqual(s.serialize(blog_entry), s.separator.join(map(str, [blog_entry.pk])))

0 commit comments

Comments
 (0)