Commit 1e678791 by Tom Christie

Merge pull request #2922 from thedrow/patch-11

Cache fields list for to_internal_value and to_representation
parents bbca795c 1701ddae
...@@ -14,6 +14,7 @@ from __future__ import unicode_literals ...@@ -14,6 +14,7 @@ from __future__ import unicode_literals
from django.db import models from django.db import models
from django.db.models.fields import FieldDoesNotExist, Field as DjangoModelField from django.db.models.fields import FieldDoesNotExist, Field as DjangoModelField
from django.db.models import query from django.db.models import query
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import ( from rest_framework.compat import (
postgres_fields, postgres_fields,
...@@ -318,6 +319,20 @@ class Serializer(BaseSerializer): ...@@ -318,6 +319,20 @@ class Serializer(BaseSerializer):
self._fields[key] = value self._fields[key] = value
return self._fields return self._fields
@cached_property
def _writable_fields(self):
return [
field for field in self.fields.values()
if (not field.read_only) or (field.default is not empty)
]
@cached_property
def _readable_fields(self):
return [
field for field in self.fields.values()
if not field.write_only
]
def get_fields(self): def get_fields(self):
""" """
Returns a dictionary of {field_name: field_instance}. Returns a dictionary of {field_name: field_instance}.
...@@ -392,10 +407,7 @@ class Serializer(BaseSerializer): ...@@ -392,10 +407,7 @@ class Serializer(BaseSerializer):
ret = OrderedDict() ret = OrderedDict()
errors = OrderedDict() errors = OrderedDict()
fields = [ fields = self._writable_fields
field for field in self.fields.values()
if (not field.read_only) or (field.default is not empty)
]
for field in fields: for field in fields:
validate_method = getattr(self, 'validate_' + field.field_name, None) validate_method = getattr(self, 'validate_' + field.field_name, None)
...@@ -423,7 +435,7 @@ class Serializer(BaseSerializer): ...@@ -423,7 +435,7 @@ class Serializer(BaseSerializer):
Object instance -> Dict of primitive datatypes. Object instance -> Dict of primitive datatypes.
""" """
ret = OrderedDict() ret = OrderedDict()
fields = [field for field in self.fields.values() if not field.write_only] fields = self._readable_fields
for field in fields: for field in fields:
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment