mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-24 00:04:16 +03:00
Merge pull request #1477 from vlastv/patch-1
Writable star source with instance
This commit is contained in:
commit
73cd4e236f
|
@ -438,16 +438,6 @@ class BaseSerializer(WritableField):
|
||||||
raise ValidationError(self.error_messages['required'])
|
raise ValidationError(self.error_messages['required'])
|
||||||
return
|
return
|
||||||
|
|
||||||
# Set the serializer object if it exists
|
|
||||||
obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None
|
|
||||||
|
|
||||||
# If we have a model manager or similar object then we need
|
|
||||||
# to iterate through each instance.
|
|
||||||
if (self.many and
|
|
||||||
not hasattr(obj, '__iter__') and
|
|
||||||
is_simple_callable(getattr(obj, 'all', None))):
|
|
||||||
obj = obj.all()
|
|
||||||
|
|
||||||
if self.source == '*':
|
if self.source == '*':
|
||||||
if value:
|
if value:
|
||||||
reverted_data = self.restore_fields(value, {})
|
reverted_data = self.restore_fields(value, {})
|
||||||
|
@ -457,6 +447,16 @@ class BaseSerializer(WritableField):
|
||||||
if value in (None, ''):
|
if value in (None, ''):
|
||||||
into[(self.source or field_name)] = None
|
into[(self.source or field_name)] = None
|
||||||
else:
|
else:
|
||||||
|
# Set the serializer object if it exists
|
||||||
|
obj = get_component(self.parent.object, self.source or field_name) if self.parent.object else None
|
||||||
|
|
||||||
|
# If we have a model manager or similar object then we need
|
||||||
|
# to iterate through each instance.
|
||||||
|
if (self.many and
|
||||||
|
not hasattr(obj, '__iter__') and
|
||||||
|
is_simple_callable(getattr(obj, 'all', None))):
|
||||||
|
obj = obj.all()
|
||||||
|
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'instance': obj,
|
'instance': obj,
|
||||||
'data': value,
|
'data': value,
|
||||||
|
|
|
@ -508,6 +508,32 @@ class ValidationTests(TestCase):
|
||||||
)
|
)
|
||||||
self.assertEqual(serializer.is_valid(), True)
|
self.assertEqual(serializer.is_valid(), True)
|
||||||
|
|
||||||
|
def test_writable_star_source_on_nested_serializer_with_parent_object(self):
|
||||||
|
class TitleSerializer(serializers.Serializer):
|
||||||
|
title = serializers.WritableField(source='title')
|
||||||
|
|
||||||
|
class AlbumSerializer(serializers.ModelSerializer):
|
||||||
|
nested = TitleSerializer(source='*')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Album
|
||||||
|
fields = ('nested',)
|
||||||
|
|
||||||
|
class PhotoSerializer(serializers.ModelSerializer):
|
||||||
|
album = AlbumSerializer(source='album')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Photo
|
||||||
|
fields = ('album', )
|
||||||
|
|
||||||
|
photo = Photo(album=Album())
|
||||||
|
|
||||||
|
data = {'album': {'nested': {'title': 'test'}}}
|
||||||
|
|
||||||
|
serializer = PhotoSerializer(photo, data=data)
|
||||||
|
self.assertEqual(serializer.is_valid(), True)
|
||||||
|
self.assertEqual(serializer.data, data)
|
||||||
|
|
||||||
def test_writable_star_source_with_inner_source_fields(self):
|
def test_writable_star_source_with_inner_source_fields(self):
|
||||||
"""
|
"""
|
||||||
Tests that a serializer with source="*" correctly expands the
|
Tests that a serializer with source="*" correctly expands the
|
||||||
|
|
Loading…
Reference in New Issue
Block a user