modelserializer support

This commit is contained in:
Warren Jin 2015-02-03 08:56:20 -05:00
parent 3c7bd7f7f5
commit 85714ee3d9
2 changed files with 43 additions and 0 deletions

View File

@ -1323,6 +1323,15 @@ class RecursiveField(Field):
self.to = to self.to = to
self.kwargs = kwargs self.kwargs = kwargs
# Need to properly initialize by calling super-constructor for
# ModelSerializers
super_kwargs = dict(
(key, kwargs[key])
for key in kwargs
if key in inspect.getargspec(Field.__init__)
)
super(RecursiveField, self).__init__(**super_kwargs)
def bind(self, field_name, parent): def bind(self, field_name, parent):
if hasattr(parent, 'child') and parent.child is self: if hasattr(parent, 'child') and parent.child is self:
# RecursiveField nested inside of a ListField # RecursiveField nested inside of a ListField

View File

@ -1,3 +1,4 @@
from django.db import models
from rest_framework import serializers from rest_framework import serializers
@ -32,6 +33,19 @@ class SillySerializer(serializers.Serializer):
self = serializers.RecursiveField(required=False) self = serializers.RecursiveField(required=False)
class RecursiveModel(models.Model):
name = models.CharField(max_length=255)
parent = models.ForeignKey('self', null=True)
class RecursiveModelSerializer(serializers.ModelSerializer):
parent = serializers.RecursiveField(allow_null=True)
class Meta:
model = RecursiveModel
fields = ('name', 'parent')
class TestRecursiveField: class TestRecursiveField:
@staticmethod @staticmethod
def serialize(serializer_class, value): def serialize(serializer_class, value):
@ -152,3 +166,23 @@ class TestRecursiveField:
serializer = SillySerializer(data=way_too_long) serializer = SillySerializer(data=way_too_long)
assert not serializer.is_valid(), \ assert not serializer.is_valid(), \
'validation should fail on inner link validation' 'validation should fail on inner link validation'
def test_model_serializer(self):
one = RecursiveModel(name='one')
two = RecursiveModel(name='two', parent=one)
#serialization
representation = {
'name': 'two',
'parent': {
'name': 'one',
'parent': None,
}
}
s = RecursiveModelSerializer(two)
assert s.data == representation
#deserialization
self.deserialize(RecursiveModelSerializer, representation)