aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2012-12-18 18:21:58 +0000
committerTom Christie2012-12-18 18:21:58 +0000
commit6693d2d277823c9150077c7c9534b7550dfd192c (patch)
treee7f547a95cc152a8a809ab39595c3008d2e16c1e /rest_framework
parent8f23b7f2f901751ecb79e98a540d3a8dc83b0d1a (diff)
downloaddjango-rest-framework-6693d2d277823c9150077c7c9534b7550dfd192c.tar.bz2
Fix for pks returning as strings when set in pre_save. Fixes #482. Thanks to @n8agrin for the bug report.
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/mixins.py4
-rw-r--r--rest_framework/serializers.py24
-rw-r--r--rest_framework/tests/generics.py2
3 files changed, 18 insertions, 12 deletions
diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py
index 1edcfa5c..8dc0c329 100644
--- a/rest_framework/mixins.py
+++ b/rest_framework/mixins.py
@@ -113,6 +113,10 @@ class UpdateModelMixin(object):
slug_field = self.get_slug_field()
setattr(obj, slug_field, slug)
+ # Ensure we clean the attributes so that we don't eg return integer
+ # pk using a string representation, as provided by the url conf kwarg.
+ obj.full_clean()
+
class DestroyModelMixin(object):
"""
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 02377492..8156bc18 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -497,25 +497,27 @@ class ModelSerializer(Serializer):
if instance is not None:
for key, val in attrs.items():
setattr(instance, key, val)
- return instance
- # Reverse relations
- for (obj, model) in self.opts.model._meta.get_all_related_m2m_objects_with_model():
- field_name = obj.field.related_query_name()
- if field_name in attrs:
- self.m2m_data[field_name] = attrs.pop(field_name)
+ else:
+ # Reverse relations
+ for (obj, model) in self.opts.model._meta.get_all_related_m2m_objects_with_model():
+ field_name = obj.field.related_query_name()
+ if field_name in attrs:
+ self.m2m_data[field_name] = attrs.pop(field_name)
+
+ # Forward relations
+ for field in self.opts.model._meta.many_to_many:
+ if field.name in attrs:
+ self.m2m_data[field.name] = attrs.pop(field.name)
- # Forward relations
- for field in self.opts.model._meta.many_to_many:
- if field.name in attrs:
- self.m2m_data[field.name] = attrs.pop(field.name)
+ instance = self.opts.model(**attrs)
- instance = self.opts.model(**attrs)
try:
instance.full_clean(exclude=self.get_validation_exclusions())
except ValidationError, err:
self._errors = err.message_dict
return None
+
return instance
def save(self, save_m2m=True):
diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py
index 14fa66f9..7c24d84e 100644
--- a/rest_framework/tests/generics.py
+++ b/rest_framework/tests/generics.py
@@ -175,7 +175,7 @@ class TestInstanceView(TestCase):
content = {'text': 'foobar'}
request = factory.put('/1', json.dumps(content),
content_type='application/json')
- response = self.view(request, pk=1).render()
+ response = self.view(request, pk='1').render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
self.assertEquals(response.data, {'id': 1, 'text': 'foobar'})
updated = self.objects.get(id=1)