mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-29 17:39:48 +03:00
Merge 1227438a39
into 73019f91fe
This commit is contained in:
commit
8a11a8b316
|
@ -43,6 +43,7 @@ You can determine your currently installed version using `pip freeze`:
|
|||
### Master
|
||||
|
||||
* Made Login template more easy to restyle.
|
||||
* Bugfix: Fix single pks/slugs are not serialized to list when sent to many relation
|
||||
|
||||
### 2.2.7
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from __future__ import unicode_literals
|
||||
from collections import Iterable
|
||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
|
||||
from django import forms
|
||||
|
@ -162,7 +163,10 @@ class RelatedField(WritableField):
|
|||
elif value in (None, ''):
|
||||
into[(self.source or field_name)] = None
|
||||
elif self.many:
|
||||
into[(self.source or field_name)] = [self.from_native(item) for item in value]
|
||||
if isinstance(value, basestring) or not isinstance(value, Iterable):
|
||||
into[(self.source or field_name)] = [self.from_native(value)]
|
||||
else:
|
||||
into[(self.source or field_name)] = [self.from_native(item) for item in value]
|
||||
else:
|
||||
into[(self.source or field_name)] = self.from_native(value)
|
||||
|
||||
|
|
|
@ -230,6 +230,33 @@ class PKForeignKeyTests(TestCase):
|
|||
]
|
||||
self.assertEqual(serializer.data, expected)
|
||||
|
||||
def test_reverse_foreign_key_update_only_one_int(self):
|
||||
data = {'id': 2, 'name': 'target-2', 'sources': 1}
|
||||
instance = ForeignKeyTarget.objects.get(pk=2)
|
||||
serializer = ForeignKeyTargetSerializer(instance, data=data)
|
||||
self.assertTrue(serializer.is_valid())
|
||||
# We shouldn't have saved anything to the db yet since save
|
||||
# hasn't been called.
|
||||
queryset = ForeignKeyTarget.objects.all()
|
||||
new_serializer = ForeignKeyTargetSerializer(queryset, many=True)
|
||||
expected = [
|
||||
{'id': 1, 'name': 'target-1', 'sources': [1, 2, 3]},
|
||||
{'id': 2, 'name': 'target-2', 'sources': []},
|
||||
]
|
||||
self.assertEqual(new_serializer.data, expected)
|
||||
|
||||
serializer.save()
|
||||
self.assertEqual(serializer.data, {'id': 2, 'name': 'target-2', 'sources': [1]})
|
||||
|
||||
# Ensure target 2 is update, and everything else is as expected
|
||||
queryset = ForeignKeyTarget.objects.all()
|
||||
serializer = ForeignKeyTargetSerializer(queryset, many=True)
|
||||
expected = [
|
||||
{'id': 1, 'name': 'target-1', 'sources': [2, 3]},
|
||||
{'id': 2, 'name': 'target-2', 'sources': [1]},
|
||||
]
|
||||
self.assertEqual(serializer.data, expected)
|
||||
|
||||
def test_foreign_key_create(self):
|
||||
data = {'id': 4, 'name': 'source-4', 'target': 2}
|
||||
serializer = ForeignKeySourceSerializer(data=data)
|
||||
|
|
|
@ -106,6 +106,33 @@ class SlugForeignKeyTests(TestCase):
|
|||
]
|
||||
self.assertEqual(serializer.data, expected)
|
||||
|
||||
def test_reverse_foreign_key_update_only_one_instance_as_string(self):
|
||||
data = {'id': 2, 'name': 'target-2', 'sources': 'source-1'}
|
||||
instance = ForeignKeyTarget.objects.get(pk=2)
|
||||
serializer = ForeignKeyTargetSerializer(instance, data=data)
|
||||
self.assertTrue(serializer.is_valid())
|
||||
# We shouldn't have saved anything to the db yet since save
|
||||
# hasn't been called.
|
||||
queryset = ForeignKeyTarget.objects.all()
|
||||
new_serializer = ForeignKeyTargetSerializer(queryset, many=True)
|
||||
expected = [
|
||||
{'id': 1, 'name': 'target-1', 'sources': ['source-1', 'source-2', 'source-3']},
|
||||
{'id': 2, 'name': 'target-2', 'sources': []},
|
||||
]
|
||||
self.assertEqual(new_serializer.data, expected)
|
||||
|
||||
serializer.save()
|
||||
self.assertEqual(serializer.data, {'id': 2, 'name': 'target-2', 'sources': ['source-1']})
|
||||
|
||||
# Ensure target 2 is update, and everything else is as expected
|
||||
queryset = ForeignKeyTarget.objects.all()
|
||||
serializer = ForeignKeyTargetSerializer(queryset, many=True)
|
||||
expected = [
|
||||
{'id': 1, 'name': 'target-1', 'sources': ['source-2', 'source-3']},
|
||||
{'id': 2, 'name': 'target-2', 'sources': ['source-1']},
|
||||
]
|
||||
self.assertEqual(serializer.data, expected)
|
||||
|
||||
def test_foreign_key_create(self):
|
||||
data = {'id': 4, 'name': 'source-4', 'target': 'target-2'}
|
||||
serializer = ForeignKeySourceSerializer(data=data)
|
||||
|
|
Loading…
Reference in New Issue
Block a user