change the meta option read_only_fields to read_only,

add tests and docs for read_only fields
This commit is contained in:
Pavel Savchenko 2012-11-06 23:08:32 +02:00
parent d689468dcb
commit 355cf94060
3 changed files with 26 additions and 3 deletions

View File

@ -233,6 +233,15 @@ The default `ModelSerializer` uses primary keys for relationships, but you can a
The `depth` option should be set to an integer value that indicates the depth of relationships that should be traversed before reverting to a flat representation. The `depth` option should be set to an integer value that indicates the depth of relationships that should be traversed before reverting to a flat representation.
## Specifying which fields should be read_only in bulk
You may wish to specify multiple fields as "read_only" which effectively ignores these fields when they appear in an "unsafe" request. Instead of adding each field explicitely with the `read_only=True` attribute, you may use the `read_only` Meta option, like so:
class MySerializer(serializers.ModelSerializer):
class Meta:
model = Fruit
read_only = ("color", "texture", "flavor", "family",)
## Customising the default fields ## Customising the default fields
You can create customized subclasses of `ModelSerializer` that use a different set of default fields for the representation, by overriding various `get_<field_type>_field` methods. You can create customized subclasses of `ModelSerializer` that use a different set of default fields for the representation, by overriding various `get_<field_type>_field` methods.

View File

@ -73,7 +73,7 @@ class SerializerOptions(object):
self.depth = getattr(meta, 'depth', 0) self.depth = getattr(meta, 'depth', 0)
self.fields = getattr(meta, 'fields', ()) self.fields = getattr(meta, 'fields', ())
self.exclude = getattr(meta, 'exclude', ()) self.exclude = getattr(meta, 'exclude', ())
self.read_only_fields = getattr(meta, 'read_only_fields', ()) self.read_only = getattr(meta, 'read_only', ())
class BaseSerializer(Field): class BaseSerializer(Field):
@ -125,7 +125,7 @@ class BaseSerializer(Field):
# Add in the default fields # Add in the default fields
fields = self.default_fields(serialize, obj, data, nested) fields = self.default_fields(serialize, obj, data, nested)
for key, val in fields.items(): for key, val in fields.items():
if key in self.opts.read_only_fields: if key in self.opts.read_only:
val.read_only = True val.read_only = True
if key not in ret: if key not in ret:

View File

@ -51,6 +51,7 @@ class PersonSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Person model = Person
fields = ('name', 'age', 'info') fields = ('name', 'age', 'info')
read_only = ('age',)
class BasicTests(TestCase): class BasicTests(TestCase):
@ -105,7 +106,7 @@ class BasicTests(TestCase):
self.assertEquals(serializer.object, expected) self.assertEquals(serializer.object, expected)
self.assertTrue(serializer.object is expected) self.assertTrue(serializer.object is expected)
self.assertEquals(serializer.data['sub_comment'], 'And Merry Christmas!') self.assertEquals(serializer.data['sub_comment'], 'And Merry Christmas!')
def test_model_fields_as_expected(self): def test_model_fields_as_expected(self):
""" Make sure that the fields returned are the same as defined """ Make sure that the fields returned are the same as defined
in the Meta data in the Meta data
@ -121,6 +122,18 @@ class BasicTests(TestCase):
expected = self.person_data expected = self.person_data
self.assertEquals(serializer.data['info'], expected) self.assertEquals(serializer.data['info'], expected)
def test_read_only_fields(self):
"""
Attempting to update fields set as read_only should have no effect.
"""
serializer = PersonSerializer({'name': 'dwight', 'age': 99}, instance=self.person)
self.assertEquals(serializer.is_valid(), True)
instance = serializer.save()
self.assertEquals(serializer.errors, {})
# Assert age is unchanged (35)
self.assertEquals(instance.age, self.person_data['age'])
class ValidationTests(TestCase): class ValidationTests(TestCase):
def setUp(self): def setUp(self):
@ -220,6 +233,7 @@ class ValidationTests(TestCase):
""" """
Omitting a value for null-field should validate. Omitting a value for null-field should validate.
""" """
serializer = PersonSerializer({'name': 'marko'}) serializer = PersonSerializer({'name': 'marko'})
self.assertEquals(serializer.is_valid(), True) self.assertEquals(serializer.is_valid(), True)
self.assertEquals(serializer.errors, {}) self.assertEquals(serializer.errors, {})