Merge pull request #802 from chenjyw/master

Fix nesting issue with depth >=2
This commit is contained in:
Tom Christie 2013-04-29 01:27:19 -07:00
commit 50873343b2
2 changed files with 21 additions and 24 deletions

View File

@ -205,18 +205,6 @@ class BaseSerializer(WritableField):
return ret return ret
#####
# Field methods - used when the serializer class is itself used as a field.
def initialize(self, parent, field_name):
"""
Same behaviour as usual Field, except that we need to keep track
of state so that we can deal with handling maximum depth.
"""
super(BaseSerializer, self).initialize(parent, field_name)
if parent.opts.depth:
self.opts.depth = parent.opts.depth - 1
##### #####
# Methods to convert or revert from objects <--> primitive representations. # Methods to convert or revert from objects <--> primitive representations.
@ -619,6 +607,8 @@ class ModelSerializer(Serializer):
class NestedModelSerializer(ModelSerializer): class NestedModelSerializer(ModelSerializer):
class Meta: class Meta:
model = model_field.rel.to model = model_field.rel.to
depth = self.opts.depth - 1
return NestedModelSerializer() return NestedModelSerializer()
def get_related_field(self, model_field, to_many=False): def get_related_field(self, model_field, to_many=False):

View File

@ -3,7 +3,7 @@ from django.utils.datastructures import MultiValueDict
from django.test import TestCase from django.test import TestCase
from rest_framework import serializers from rest_framework import serializers
from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel, from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel,
BlankFieldModel, BlogPost, Book, CallableDefaultValueModel, DefaultValueModel, BlankFieldModel, BlogPost, BlogPostComment, Book, CallableDefaultValueModel, DefaultValueModel,
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo) ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo)
import datetime import datetime
import pickle import pickle
@ -767,8 +767,6 @@ class RelatedTraversalTest(TestCase):
post = BlogPost.objects.create(title="Test blog post", writer=user) post = BlogPost.objects.create(title="Test blog post", writer=user)
post.blogpostcomment_set.create(text="I love this blog post") post.blogpostcomment_set.create(text="I love this blog post")
from rest_framework.tests.models import BlogPostComment
class PersonSerializer(serializers.ModelSerializer): class PersonSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Person model = Person
@ -968,23 +966,26 @@ class SerializerPickleTests(TestCase):
class DepthTest(TestCase): class DepthTest(TestCase):
def test_implicit_nesting(self): def test_implicit_nesting(self):
writer = Person.objects.create(name="django", age=1) writer = Person.objects.create(name="django", age=1)
post = BlogPost.objects.create(title="Test blog post", writer=writer) post = BlogPost.objects.create(title="Test blog post", writer=writer)
comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post)
class BlogPostSerializer(serializers.ModelSerializer): class BlogPostCommentSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = BlogPost model = BlogPostComment
depth = 1 depth = 2
serializer = BlogPostSerializer(instance=post) serializer = BlogPostCommentSerializer(instance=comment)
expected = {'id': 1, 'title': 'Test blog post', expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post',
'writer': {'id': 1, 'name': 'django', 'age': 1}} 'writer': {'id': 1, 'name': 'django', 'age': 1}}}
self.assertEqual(serializer.data, expected) self.assertEqual(serializer.data, expected)
def test_explicit_nesting(self): def test_explicit_nesting(self):
writer = Person.objects.create(name="django", age=1) writer = Person.objects.create(name="django", age=1)
post = BlogPost.objects.create(title="Test blog post", writer=writer) post = BlogPost.objects.create(title="Test blog post", writer=writer)
comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post)
class PersonSerializer(serializers.ModelSerializer): class PersonSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -996,9 +997,15 @@ class DepthTest(TestCase):
class Meta: class Meta:
model = BlogPost model = BlogPost
serializer = BlogPostSerializer(instance=post) class BlogPostCommentSerializer(serializers.ModelSerializer):
expected = {'id': 1, 'title': 'Test blog post', blog_post = BlogPostSerializer()
'writer': {'id': 1, 'name': 'django', 'age': 1}}
class Meta:
model = BlogPostComment
serializer = BlogPostCommentSerializer(instance=comment)
expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'id': 1, 'title': 'Test blog post',
'writer': {'id': 1, 'name': 'django', 'age': 1}}}
self.assertEqual(serializer.data, expected) self.assertEqual(serializer.data, expected)