From 85714ee3d9effafde00e1b80badd664a29c096bb Mon Sep 17 00:00:00 2001 From: Warren Jin Date: Tue, 3 Feb 2015 08:56:20 -0500 Subject: [PATCH] modelserializer support --- rest_framework/fields.py | 9 +++++++++ tests/test_recursive.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 7223c46b4..f15e0131d 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1323,6 +1323,15 @@ class RecursiveField(Field): self.to = to 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): if hasattr(parent, 'child') and parent.child is self: # RecursiveField nested inside of a ListField diff --git a/tests/test_recursive.py b/tests/test_recursive.py index a4524bbb7..e360f0e83 100644 --- a/tests/test_recursive.py +++ b/tests/test_recursive.py @@ -1,3 +1,4 @@ +from django.db import models from rest_framework import serializers @@ -32,6 +33,19 @@ class SillySerializer(serializers.Serializer): 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: @staticmethod def serialize(serializer_class, value): @@ -152,3 +166,23 @@ class TestRecursiveField: serializer = SillySerializer(data=way_too_long) assert not serializer.is_valid(), \ '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) +