Skip to content

Commit 7394dce

Browse files
committed
ReturnList and ReturnDict wrapped at nicer point
1 parent cb672a0 commit 7394dce

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

rest_framework/serializers.py

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -245,18 +245,18 @@ def get_validators(self):
245245

246246
def get_initial(self):
247247
if self._initial_data is not None:
248-
return ReturnDict([
248+
return OrderedDict([
249249
(field_name, field.get_value(self._initial_data))
250250
for field_name, field in self.fields.items()
251251
if field.get_value(self._initial_data) is not empty
252252
and not field.read_only
253-
], serializer=self)
253+
])
254254

255-
return ReturnDict([
255+
return OrderedDict([
256256
(field.field_name, field.get_initial())
257257
for field in self.fields.values()
258258
if not field.read_only
259-
], serializer=self)
259+
])
260260

261261
def get_value(self, dictionary):
262262
# We override the default field access in order to support
@@ -319,8 +319,8 @@ def to_internal_value(self, data):
319319
"""
320320
Dict of native values <- Dict of primitive datatypes.
321321
"""
322-
ret = {}
323-
errors = ReturnDict(serializer=self)
322+
ret = OrderedDict()
323+
errors = OrderedDict()
324324
fields = [
325325
field for field in self.fields.values()
326326
if (not field.read_only) or (field.default is not empty)
@@ -349,7 +349,7 @@ def to_representation(self, instance):
349349
"""
350350
Object instance -> Dict of primitive datatypes.
351351
"""
352-
ret = ReturnDict(serializer=self)
352+
ret = OrderedDict()
353353
fields = [field for field in self.fields.values() if not field.write_only]
354354

355355
for field in fields:
@@ -388,6 +388,19 @@ def __getitem__(self, key):
388388
return NestedBoundField(field, value, error)
389389
return BoundField(field, value, error)
390390

391+
# Include a backlink to the serializer class on return objects.
392+
# Allows renderers such as HTMLFormRenderer to get the full field info.
393+
394+
@property
395+
def data(self):
396+
ret = super(Serializer, self).data
397+
return ReturnDict(ret, serializer=self)
398+
399+
@property
400+
def errors(self):
401+
ret = super(Serializer, self).errors
402+
return ReturnDict(ret, serializer=self)
403+
391404

392405
# There's some replication of `ListField` here,
393406
# but that's probably better than obfuscating the call hierarchy.
@@ -410,7 +423,7 @@ def __init__(self, *args, **kwargs):
410423
def get_initial(self):
411424
if self._initial_data is not None:
412425
return self.to_representation(self._initial_data)
413-
return ReturnList(serializer=self)
426+
return []
414427

415428
def get_value(self, dictionary):
416429
"""
@@ -438,7 +451,7 @@ def to_internal_value(self, data):
438451
})
439452

440453
ret = []
441-
errors = ReturnList(serializer=self)
454+
errors = []
442455

443456
for item in data:
444457
try:
@@ -459,10 +472,9 @@ def to_representation(self, data):
459472
List of object instances -> List of dicts of primitive datatypes.
460473
"""
461474
iterable = data.all() if (hasattr(data, 'all')) else data
462-
return ReturnList(
463-
[self.child.to_representation(item) for item in iterable],
464-
serializer=self
465-
)
475+
return [
476+
self.child.to_representation(item) for item in iterable
477+
]
466478

467479
def update(self, instance, validated_data):
468480
raise NotImplementedError(
@@ -503,6 +515,21 @@ def save(self, **kwargs):
503515
def __repr__(self):
504516
return representation.list_repr(self, indent=1)
505517

518+
# Include a backlink to the serializer class on return objects.
519+
# Allows renderers such as HTMLFormRenderer to get the full field info.
520+
521+
@property
522+
def data(self):
523+
ret = super(ListSerializer, self).data
524+
return ReturnList(ret, serializer=self)
525+
526+
@property
527+
def errors(self):
528+
ret = super(ListSerializer, self).errors
529+
if isinstance(ret, dict):
530+
return ReturnDict(ret, serializer=self)
531+
return ReturnList(ret, serializer=self)
532+
506533

507534
# ModelSerializer & HyperlinkedModelSerializer
508535
# --------------------------------------------

0 commit comments

Comments
 (0)