Merge branch 'recursion'

This commit is contained in:
Warren Jin 2015-01-25 23:11:30 -05:00
commit 9969dc0e68
2 changed files with 16 additions and 9 deletions

View File

@ -1269,6 +1269,7 @@ class HiddenField(Field):
def to_internal_value(self, data):
return data
class RecursiveField(Field):
"""
A field that gets its representation from its parent.
@ -1286,9 +1287,14 @@ class RecursiveField(Field):
children = ListField(child=RecursiveField())
class ListSerializer(self):
next = RecursiveField(allow_null=True)
next = RecursiveField()
"""
def __init__(self, *args, **kwargs):
kwargz = {'required': False}
kwargz.update(kwargs)
super(RecursiveField, self).__init__(*args, **kwargz)
def _get_parent(self):
if hasattr(self.parent, 'child') and self.parent.child is self:
# Recursive field nested inside of some kind of composite list field
@ -1302,6 +1308,7 @@ class RecursiveField(Field):
def to_internal_value(self, data):
return self._get_parent().to_internal_value(data)
class SerializerMethodField(Field):
"""
A read-only field that get its representation from calling a method on the

View File

@ -313,7 +313,7 @@ class TestRecursiveField:
'name': 'first',
'next': {
'name': 'second',
'next':{
'next': {
'name': 'third',
'next': None,
}
@ -328,7 +328,7 @@ class TestRecursiveField:
# test deserialization
serializer = self.link_serializer(data=value)
assert serializer.is_valid(), \
'cannot validate on deserialization'
'cannot validate on deserialization: %s' % dict(serializer.errors)
assert serializer.validated_data == value, \
'deserialized data does not match input'
@ -338,7 +338,7 @@ class TestRecursiveField:
'children': [{
'name': 'first child',
'children': [],
},{
}, {
'name': 'second child',
'children': [],
}]
@ -350,9 +350,9 @@ class TestRecursiveField:
'serialized data does not match input'
# deserialization
serializer = self.link_serializer(data=value)
serializer = self.node_serializer(data=value)
assert serializer.is_valid(), \
'cannot validate on deserialization'
'cannot validate on deserialization: %s' % dict(serializer.errors)
assert serializer.validated_data == value, \
'deserialized data does not match input'