mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-29 17:39:48 +03:00
Inline _readable_fields and _writable_fields
This is slightly faster and easier to follow.
This commit is contained in:
parent
849136a684
commit
1673be2302
|
@ -361,18 +361,6 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
|
||||||
field.bind(field_name=field_name, parent=self)
|
field.bind(field_name=field_name, parent=self)
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
@property
|
|
||||||
def _writable_fields(self):
|
|
||||||
for field in self.fields.values():
|
|
||||||
if not field.read_only:
|
|
||||||
yield field
|
|
||||||
|
|
||||||
@property
|
|
||||||
def _readable_fields(self):
|
|
||||||
for field in self.fields.values():
|
|
||||||
if not field.write_only:
|
|
||||||
yield field
|
|
||||||
|
|
||||||
def get_fields(self):
|
def get_fields(self):
|
||||||
"""
|
"""
|
||||||
Returns a dictionary of {field_name: field_instance}.
|
Returns a dictionary of {field_name: field_instance}.
|
||||||
|
@ -478,9 +466,11 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
|
||||||
|
|
||||||
ret = OrderedDict()
|
ret = OrderedDict()
|
||||||
errors = OrderedDict()
|
errors = OrderedDict()
|
||||||
fields = self._writable_fields
|
|
||||||
|
|
||||||
for field in fields:
|
for field in self.fields.values():
|
||||||
|
if field.read_only:
|
||||||
|
continue
|
||||||
|
|
||||||
validate_method = getattr(self, 'validate_' + field.field_name, None)
|
validate_method = getattr(self, 'validate_' + field.field_name, None)
|
||||||
primitive_value = field.get_value(data)
|
primitive_value = field.get_value(data)
|
||||||
try:
|
try:
|
||||||
|
@ -506,9 +496,11 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
|
||||||
Object instance -> Dict of primitive datatypes.
|
Object instance -> Dict of primitive datatypes.
|
||||||
"""
|
"""
|
||||||
ret = OrderedDict()
|
ret = OrderedDict()
|
||||||
fields = self._readable_fields
|
|
||||||
|
|
||||||
for field in fields:
|
for field in self.fields.values():
|
||||||
|
if field.write_only:
|
||||||
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
attribute = field.get_attribute(instance)
|
attribute = field.get_attribute(instance)
|
||||||
except SkipField:
|
except SkipField:
|
||||||
|
@ -808,7 +800,8 @@ def raise_errors_on_nested_writes(method_name, serializer, validated_data):
|
||||||
isinstance(field, BaseSerializer) and
|
isinstance(field, BaseSerializer) and
|
||||||
(field.source in validated_data) and
|
(field.source in validated_data) and
|
||||||
isinstance(validated_data[field.source], (list, dict))
|
isinstance(validated_data[field.source], (list, dict))
|
||||||
for field in serializer._writable_fields
|
for field in serializer.fields.values()
|
||||||
|
if not field.read_only
|
||||||
), (
|
), (
|
||||||
'The `.{method_name}()` method does not support writable nested '
|
'The `.{method_name}()` method does not support writable nested '
|
||||||
'fields by default.\nWrite an explicit `.{method_name}()` method for '
|
'fields by default.\nWrite an explicit `.{method_name}()` method for '
|
||||||
|
@ -1498,8 +1491,8 @@ class ModelSerializer(Serializer):
|
||||||
# cannot map to a field, and must be a traversal, so we're not
|
# cannot map to a field, and must be a traversal, so we're not
|
||||||
# including those.
|
# including those.
|
||||||
field_names = {
|
field_names = {
|
||||||
field.source for field in self._writable_fields
|
field.source for field in self.fields.values()
|
||||||
if (field.source != '*') and ('.' not in field.source)
|
if not field.read_only and field.source != '*' and '.' not in field.source
|
||||||
}
|
}
|
||||||
|
|
||||||
# Special Case: Add read_only fields with defaults.
|
# Special Case: Add read_only fields with defaults.
|
||||||
|
|
|
@ -214,13 +214,6 @@ class TestReadOnly:
|
||||||
writable = serializers.IntegerField()
|
writable = serializers.IntegerField()
|
||||||
self.Serializer = TestSerializer
|
self.Serializer = TestSerializer
|
||||||
|
|
||||||
def test_writable_fields(self):
|
|
||||||
"""
|
|
||||||
Read-only fields should not be writable, even with default ()
|
|
||||||
"""
|
|
||||||
serializer = self.Serializer()
|
|
||||||
assert len(list(serializer._writable_fields)) == 1
|
|
||||||
|
|
||||||
def test_validate_read_only(self):
|
def test_validate_read_only(self):
|
||||||
"""
|
"""
|
||||||
Read-only serializers.should not be included in validation.
|
Read-only serializers.should not be included in validation.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user