adding test cases and doc entry

This commit is contained in:
Jonas Braun 2013-04-18 13:02:00 +02:00
parent 36ba0147c0
commit 1227438a39
4 changed files with 58 additions and 2 deletions

View File

@ -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

View File

@ -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,8 +163,8 @@ class RelatedField(WritableField):
elif value in (None, ''):
into[(self.source or field_name)] = None
elif self.many:
if isinstance(value, basestring):
into[(self.source or field_name)] = self.from_native(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:

View File

@ -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)

View File

@ -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)