mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 20:40:14 +03:00
Merge 8a04d6e9fd
into 411511622d
This commit is contained in:
commit
f9651bd80b
|
@ -587,10 +587,10 @@ class BaseSerializer(WritableField):
|
||||||
self._data = None
|
self._data = None
|
||||||
|
|
||||||
if isinstance(self.object, list):
|
if isinstance(self.object, list):
|
||||||
[self.save_object(item, **kwargs) for item in self.object]
|
|
||||||
|
|
||||||
if self.object._deleted:
|
if self.object._deleted:
|
||||||
[self.delete_object(item) for item in self.object._deleted]
|
[self.delete_object(item) for item in self.object._deleted]
|
||||||
|
|
||||||
|
[self.save_object(item, **kwargs) for item in self.object]
|
||||||
else:
|
else:
|
||||||
self.save_object(self.object, **kwargs)
|
self.save_object(self.object, **kwargs)
|
||||||
|
|
||||||
|
@ -1049,16 +1049,16 @@ class ModelSerializer(Serializer):
|
||||||
])
|
])
|
||||||
for accessor_name, related in obj._related_data.items():
|
for accessor_name, related in obj._related_data.items():
|
||||||
if isinstance(related, RelationsList):
|
if isinstance(related, RelationsList):
|
||||||
|
# Delete any removed objects
|
||||||
|
if related._deleted:
|
||||||
|
[self.delete_object(item) for item in related._deleted]
|
||||||
|
|
||||||
# Nested reverse fk relationship
|
# Nested reverse fk relationship
|
||||||
for related_item in related:
|
for related_item in related:
|
||||||
fk_field = related_fields[accessor_name].field.name
|
fk_field = related_fields[accessor_name].field.name
|
||||||
setattr(related_item, fk_field, obj)
|
setattr(related_item, fk_field, obj)
|
||||||
self.save_object(related_item)
|
self.save_object(related_item)
|
||||||
|
|
||||||
# Delete any removed objects
|
|
||||||
if related._deleted:
|
|
||||||
[self.delete_object(item) for item in related._deleted]
|
|
||||||
|
|
||||||
elif isinstance(related, models.Model):
|
elif isinstance(related, models.Model):
|
||||||
# Nested reverse one-one relationship
|
# Nested reverse one-one relationship
|
||||||
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.timezone import now
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
|
@ -103,6 +104,10 @@ class Person(RESTFrameworkModel):
|
||||||
class BlogPost(RESTFrameworkModel):
|
class BlogPost(RESTFrameworkModel):
|
||||||
title = models.CharField(max_length=100)
|
title = models.CharField(max_length=100)
|
||||||
writer = models.ForeignKey(Person, null=True, blank=True)
|
writer = models.ForeignKey(Person, null=True, blank=True)
|
||||||
|
created = models.DateTimeField(default=now)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = [('writer', 'title')]
|
||||||
|
|
||||||
def get_first_comment(self):
|
def get_first_comment(self):
|
||||||
return self.blogpostcomment_set.all()[0]
|
return self.blogpostcomment_set.all()[0]
|
||||||
|
|
|
@ -1448,7 +1448,7 @@ 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, created=datetime.datetime(1970, 1, 1))
|
||||||
comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post)
|
comment = BlogPostComment.objects.create(text="Test blog post comment", blog_post=post)
|
||||||
|
|
||||||
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
||||||
|
@ -1458,7 +1458,7 @@ class DepthTest(TestCase):
|
||||||
|
|
||||||
serializer = BlogPostCommentSerializer(instance=comment)
|
serializer = BlogPostCommentSerializer(instance=comment)
|
||||||
expected = {'id': 1, 'text': 'Test blog post comment', 'blog_post': {'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}}}
|
'created': datetime.datetime(1970, 1, 1), 'writer': {'id': 1, 'name': 'django', 'age': 1}}}
|
||||||
|
|
||||||
self.assertEqual(serializer.data, expected)
|
self.assertEqual(serializer.data, expected)
|
||||||
|
|
||||||
|
@ -1476,6 +1476,7 @@ class DepthTest(TestCase):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = BlogPost
|
model = BlogPost
|
||||||
|
exclude = ('created',)
|
||||||
|
|
||||||
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
||||||
blog_post = BlogPostSerializer()
|
blog_post = BlogPostSerializer()
|
||||||
|
|
|
@ -347,3 +347,45 @@ class NestedModelSerializerUpdateTests(TestCase):
|
||||||
result = deserialize.object
|
result = deserialize.object
|
||||||
result.save()
|
result.save()
|
||||||
self.assertEqual(result.id, john.id)
|
self.assertEqual(result.id, john.id)
|
||||||
|
|
||||||
|
def test_remove_nested_before_adding(self):
|
||||||
|
john = models.Person.objects.create(name="john")
|
||||||
|
|
||||||
|
post = john.blogpost_set.create(title="Test blog post")
|
||||||
|
post.blogpostcomment_set.create(text="I hate this blog post")
|
||||||
|
post.blogpostcomment_set.create(text="I love this blog post")
|
||||||
|
|
||||||
|
class BlogPostCommentSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.BlogPostComment
|
||||||
|
exclude = ('blog_post',)
|
||||||
|
|
||||||
|
class BlogPostSerializer(serializers.ModelSerializer):
|
||||||
|
comments = BlogPostCommentSerializer(many=True, source='blogpostcomment_set')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.BlogPost
|
||||||
|
fields = ('id', 'title', 'comments')
|
||||||
|
|
||||||
|
class PersonSerializer(serializers.ModelSerializer):
|
||||||
|
posts = BlogPostSerializer(many=True, source='blogpost_set', allow_add_remove=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Person
|
||||||
|
fields = ('id', 'name', 'age', 'posts')
|
||||||
|
|
||||||
|
serialize = PersonSerializer(instance=john)
|
||||||
|
|
||||||
|
# Remove the ID from John's post so that it is no longer the same post.
|
||||||
|
john_data = serialize.data
|
||||||
|
self.assertEqual(len(john_data['posts']), 1)
|
||||||
|
del john_data['posts'][0]['id']
|
||||||
|
|
||||||
|
deserialize = PersonSerializer(data=john_data, instance=john)
|
||||||
|
self.assertTrue(deserialize.is_valid(), deserialize.errors)
|
||||||
|
|
||||||
|
deserialize.save()
|
||||||
|
result = deserialize.object
|
||||||
|
self.assertEqual(result.id, john.id)
|
||||||
|
self.assertEqual(result.blogpost_set.count(), 1)
|
||||||
|
self.assertNotEqual(result.blogpost_set.all()[0].created, post.created)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user