mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-16 19:41:06 +03:00
commit
ea9a3d88bc
|
@ -378,23 +378,27 @@ class BaseSerializer(WritableField):
|
|||
# Set the serializer object if it exists
|
||||
obj = getattr(self.parent.object, field_name) if self.parent.object else None
|
||||
|
||||
if value in (None, ''):
|
||||
into[(self.source or field_name)] = None
|
||||
if self.source == '*':
|
||||
if value:
|
||||
into.update(value)
|
||||
else:
|
||||
kwargs = {
|
||||
'instance': obj,
|
||||
'data': value,
|
||||
'context': self.context,
|
||||
'partial': self.partial,
|
||||
'many': self.many
|
||||
}
|
||||
serializer = self.__class__(**kwargs)
|
||||
|
||||
if serializer.is_valid():
|
||||
into[self.source or field_name] = serializer.object
|
||||
if value in (None, ''):
|
||||
into[(self.source or field_name)] = None
|
||||
else:
|
||||
# Propagate errors up to our parent
|
||||
raise NestedValidationError(serializer.errors)
|
||||
kwargs = {
|
||||
'instance': obj,
|
||||
'data': value,
|
||||
'context': self.context,
|
||||
'partial': self.partial,
|
||||
'many': self.many
|
||||
}
|
||||
serializer = self.__class__(**kwargs)
|
||||
|
||||
if serializer.is_valid():
|
||||
into[self.source or field_name] = serializer.object
|
||||
else:
|
||||
# Propagate errors up to our parent
|
||||
raise NestedValidationError(serializer.errors)
|
||||
|
||||
def get_identity(self, data):
|
||||
"""
|
||||
|
|
|
@ -91,6 +91,17 @@ class PersonSerializer(serializers.ModelSerializer):
|
|||
read_only_fields = ('age',)
|
||||
|
||||
|
||||
class NestedSerializer(serializers.Serializer):
|
||||
info = serializers.Field()
|
||||
|
||||
|
||||
class ModelSerializerWithNestedSerializer(serializers.ModelSerializer):
|
||||
nested = NestedSerializer(source='*')
|
||||
|
||||
class Meta:
|
||||
model = Person
|
||||
|
||||
|
||||
class PersonSerializerInvalidReadOnly(serializers.ModelSerializer):
|
||||
"""
|
||||
Testing for #652.
|
||||
|
@ -418,6 +429,17 @@ class ValidationTests(TestCase):
|
|||
except:
|
||||
self.fail('Wrong exception type thrown.')
|
||||
|
||||
def test_writable_star_source_on_nested_serializer(self):
|
||||
"""
|
||||
Assert that a nested serializer instantiated with source='*' correctly
|
||||
expands the data into the outer serializer.
|
||||
"""
|
||||
serializer = ModelSerializerWithNestedSerializer(data={
|
||||
'name': 'marko',
|
||||
'nested': {'info': 'hi'}},
|
||||
)
|
||||
self.assertEqual(serializer.is_valid(), True)
|
||||
|
||||
|
||||
class CustomValidationTests(TestCase):
|
||||
class CommentSerializerWithFieldValidator(CommentSerializer):
|
||||
|
|
Loading…
Reference in New Issue
Block a user