Cache fields list for to_internal_value and to_representation.

This commit is contained in:
Omer Katz 2015-05-09 14:37:49 +03:00
parent 35efbe41ab
commit 1ee3173583

View File

@ -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 postgres_fields, unicode_to_repr from rest_framework.compat import postgres_fields, unicode_to_repr
from rest_framework.utils import model_meta from rest_framework.utils import model_meta
@ -314,6 +315,17 @@ class Serializer(BaseSerializer):
self._fields[key] = value self._fields[key] = value
return self._fields return self._fields
@cached_property
def _to_internal_value_fields(self):
return [
field for field in self.fields.values()
if (not field.read_only) or (field.default is not empty)
]
@cached_property
def _to_representation_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}.
@ -388,10 +400,7 @@ class Serializer(BaseSerializer):
ret = OrderedDict() ret = OrderedDict()
errors = OrderedDict() errors = OrderedDict()
fields = [ fields = self._to_internal_value_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)
@ -419,7 +428,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._to_representation_fields
for field in fields: for field in fields:
try: try: