mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 11:30:12 +03:00
Merge a5856beb03
into 068e4a18f4
This commit is contained in:
commit
f47391552f
|
@ -858,15 +858,19 @@ class ModelSerializer(Serializer):
|
|||
if isinstance(self.fields.get(field_name, None), Serializer):
|
||||
nested_forward_relations[field_name] = attrs[field_name]
|
||||
|
||||
if instance is None:
|
||||
# Create a new instance, if we need to
|
||||
field_attrs = {}
|
||||
for field_name in meta.get_all_field_names():
|
||||
if field_name in attrs:
|
||||
field_attrs[field_name] = attrs.pop(field_name)
|
||||
|
||||
instance = self.opts.model(**field_attrs)
|
||||
|
||||
# Update an existing instance...
|
||||
if instance is not None:
|
||||
for key, val in attrs.items():
|
||||
setattr(instance, key, val)
|
||||
|
||||
# ...or create a new instance
|
||||
else:
|
||||
instance = self.opts.model(**attrs)
|
||||
|
||||
# Any relations that cannot be set until we've
|
||||
# saved the model get hidden away on these
|
||||
# private attributes, so we can deal with them
|
||||
|
|
|
@ -81,10 +81,16 @@ class Person(RESTFrameworkModel):
|
|||
|
||||
@property
|
||||
def info(self):
|
||||
return {
|
||||
if not hasattr(self, '_info'):
|
||||
self._info = {
|
||||
'name': self.name,
|
||||
'age': self.age,
|
||||
}
|
||||
return self._info
|
||||
|
||||
@info.setter
|
||||
def info(self, value):
|
||||
self._info = value
|
||||
|
||||
|
||||
class BlogPost(RESTFrameworkModel):
|
||||
|
@ -163,6 +169,18 @@ class NullableOneToOneSource(RESTFrameworkModel):
|
|||
related_name='nullable_source')
|
||||
|
||||
|
||||
class ModelWithWritableProperty(RESTFrameworkModel):
|
||||
name = models.CharField(max_length=100)
|
||||
|
||||
@property
|
||||
def prop(self):
|
||||
return getattr(self, '_value', 'hi!')
|
||||
|
||||
@prop.setter
|
||||
def prop(self, value):
|
||||
self._value = value
|
||||
|
||||
|
||||
# Serializer used to test BasicModel
|
||||
class BasicModelSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
|
|
|
@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
|
|||
from rest_framework import serializers, fields, relations
|
||||
from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel,
|
||||
BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel,
|
||||
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel)
|
||||
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo, RESTFrameworkModel, ModelWithWritableProperty)
|
||||
from rest_framework.tests.models import BasicModelSerializer
|
||||
import datetime
|
||||
import pickle
|
||||
|
@ -1643,3 +1643,26 @@ class SerializerSupportsManyRelationships(TestCase):
|
|||
serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]})
|
||||
self.assertTrue(serializer.is_valid())
|
||||
self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]})
|
||||
|
||||
|
||||
### Regression test for #1088
|
||||
|
||||
class WritablePropertyModelSerializer(serializers.ModelSerializer):
|
||||
prop = serializers.CharField(source='prop')
|
||||
class Meta:
|
||||
model = ModelWithWritableProperty
|
||||
fields = ('name', 'prop',)
|
||||
|
||||
|
||||
class ModelSerializerSupportsWritableProperty(TestCase):
|
||||
def setUp(self):
|
||||
ModelWithWritableProperty.objects.create(name='hey! ')
|
||||
|
||||
def test_modelserializer_create_with_property(self):
|
||||
s = WritablePropertyModelSerializer(data={
|
||||
'name': 'the name',
|
||||
'prop': 'new value',
|
||||
})
|
||||
self.assertTrue(s.is_valid())
|
||||
obj = s.save()
|
||||
self.assertEqual(obj.prop, 'new value')
|
||||
|
|
Loading…
Reference in New Issue
Block a user