improved mixins saving objects

when creating, with force_insert
when updating, with force_update
This commit is contained in:
Ludwig Kraatz 2012-12-08 12:56:34 +01:00
parent c1be29418b
commit e828902023
2 changed files with 10 additions and 7 deletions

View File

@ -18,7 +18,7 @@ class CreateModelMixin(object):
serializer = self.get_serializer(data=request.DATA, files=request.FILES) serializer = self.get_serializer(data=request.DATA, files=request.FILES)
if serializer.is_valid(): if serializer.is_valid():
self.pre_save(serializer.object) self.pre_save(serializer.object)
self.object = serializer.save() self.object = serializer.save(force_insert=True)
headers = self.get_success_headers(serializer.data) headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@ -93,7 +93,10 @@ class UpdateModelMixin(object):
if serializer.is_valid(): if serializer.is_valid():
self.pre_save(serializer.object) self.pre_save(serializer.object)
self.object = serializer.save() if created:
self.object = serializer.save(force_insert=True)
else:
self.object = serializer.save(force_update=True)
status_code = created and status.HTTP_201_CREATED or status.HTTP_200_OK status_code = created and status.HTTP_201_CREATED or status.HTTP_200_OK
return Response(serializer.data, status=status_code) return Response(serializer.data, status=status_code)

View File

@ -339,11 +339,11 @@ class BaseSerializer(Field):
self._data = self.to_native(self.object) self._data = self.to_native(self.object)
return self._data return self._data
def save(self): def save(self,**kwargs):
""" """
Save the deserialized object and return it. Save the deserialized object and return it.
""" """
self.object.save() self.object.save(**kwargs)
return self.object return self.object
@ -519,18 +519,18 @@ class ModelSerializer(Serializer):
self.m2m_data[field.name] = attrs.pop(field.name) self.m2m_data[field.name] = attrs.pop(field.name)
return self.opts.model(**attrs) return self.opts.model(**attrs)
def save(self, save_m2m=True): def save(self, save_m2m=True, **kwargs):
""" """
Save the deserialized object and return it. Save the deserialized object and return it.
""" """
self.object.save() obj = super(ModelSerializer, self).save(**kwargs)
if getattr(self, 'm2m_data', None) and save_m2m: if getattr(self, 'm2m_data', None) and save_m2m:
for accessor_name, object_list in self.m2m_data.items(): for accessor_name, object_list in self.m2m_data.items():
setattr(self.object, accessor_name, object_list) setattr(self.object, accessor_name, object_list)
self.m2m_data = {} self.m2m_data = {}
return self.object return obj
class HyperlinkedModelSerializerOptions(ModelSerializerOptions): class HyperlinkedModelSerializerOptions(ModelSerializerOptions):