mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-30 01:49:50 +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
|
### Master
|
||||||
|
|
||||||
* Made Login template more easy to restyle.
|
* 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
|
### 2.2.7
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
from collections import Iterable
|
||||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
|
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
|
||||||
from django import forms
|
from django import forms
|
||||||
|
@ -162,7 +163,10 @@ class RelatedField(WritableField):
|
||||||
elif value in (None, ''):
|
elif value in (None, ''):
|
||||||
into[(self.source or field_name)] = None
|
into[(self.source or field_name)] = None
|
||||||
elif self.many:
|
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:
|
else:
|
||||||
into[(self.source or field_name)] = self.from_native(value)
|
into[(self.source or field_name)] = self.from_native(value)
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,33 @@ class PKForeignKeyTests(TestCase):
|
||||||
]
|
]
|
||||||
self.assertEqual(serializer.data, expected)
|
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):
|
def test_foreign_key_create(self):
|
||||||
data = {'id': 4, 'name': 'source-4', 'target': 2}
|
data = {'id': 4, 'name': 'source-4', 'target': 2}
|
||||||
serializer = ForeignKeySourceSerializer(data=data)
|
serializer = ForeignKeySourceSerializer(data=data)
|
||||||
|
|
|
@ -106,6 +106,33 @@ class SlugForeignKeyTests(TestCase):
|
||||||
]
|
]
|
||||||
self.assertEqual(serializer.data, expected)
|
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):
|
def test_foreign_key_create(self):
|
||||||
data = {'id': 4, 'name': 'source-4', 'target': 'target-2'}
|
data = {'id': 4, 'name': 'source-4', 'target': 'target-2'}
|
||||||
serializer = ForeignKeySourceSerializer(data=data)
|
serializer = ForeignKeySourceSerializer(data=data)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user