class HyperlinkedModelSerializer

from rest_framework.serializers import HyperlinkedModelSerializer
    

Ancestors (MRO)

  1. HyperlinkedModelSerializer
  2. ModelSerializer
  3. Serializer
  4. BaseSerializer
  5. Field

Attributes

  Defined in
Meta = <class 'rest_framework.serializers.Meta'> BaseSerializer
_default_view_name = %(model_name)s-detail HyperlinkedModelSerializer
_dict_class = <class 'rest_framework.serializers.SortedDictWithMetadata'> BaseSerializer
_options_class = <class 'rest_framework.serializers.HyperlinkedModelSerializerOptions'> HyperlinkedModelSerializer
_options_class = <class 'rest_framework.serializers.ModelSerializerOptions'> ModelSerializer
_options_class = <class 'rest_framework.serializers.SerializerOptions'> BaseSerializer
_use_files = None Field
base_fields = {'url': <rest_framework.relations.HyperlinkedIdentityField object at 0x1089b1f90>} HyperlinkedModelSerializer
base_fields = {} ModelSerializer
base_fields = {} Serializer
creation_counter = 4 Field
data = <property object at 0x1089b42b8> BaseSerializer
empty = Field
errors = <property object at 0x1089b4260> BaseSerializer
form_field_class = <class 'django.forms.fields.CharField'> Field
read_only = True Field
type_name = None Field
Expand Collapse

Methods

def _get_default_view_name(self, model): HyperlinkedModelSerializer

        Return the view name to use if 'view_name' is not specified in 'Meta'
        
    def _get_default_view_name(self, model):
        """
        Return the view name to use if 'view_name' is not specified in 'Meta'
        """
        model_meta = model._meta
        format_kwargs = {
            'app_label': model_meta.app_label,
            'model_name': model_meta.object_name.lower()
        }
        return self._default_view_name % format_kwargs

def attributes(self): Field

        Returns a dictionary of attributes to be used when serializing to xml.
        
    def attributes(self):
        """
        Returns a dictionary of attributes to be used when serializing to xml.
        """
        if self.type_name:
            return {'type': self.type_name}
        return {}

def convert_object(self, obj): BaseSerializer

        Core of serialization.
        Convert an object into a dictionary of serialized field values.
        
    def convert_object(self, obj):
        """
        Core of serialization.
        Convert an object into a dictionary of serialized field values.
        """
        ret = self._dict_class()
        ret.fields = {}

        for field_name, field in self.fields.items():
            field.initialize(parent=self, field_name=field_name)
            key = self.get_field_key(field_name)
            value = field.field_to_native(obj, field_name)
            ret[key] = value
            ret.fields[key] = field
        return ret

def field_from_native(self, data, files, field_name, into): Field

        Given a dictionary and a field name, updates the dictionary `into`,
        with the field and it's deserialized value.
        
    def field_from_native(self, data, files, field_name, into):
        """
        Given a dictionary and a field name, updates the dictionary `into`,
        with the field and it's deserialized value.
        """
        return

def field_to_native(self, obj, field_name):

BaseSerializer

        Override default so that we can apply ModelSerializer as a nested
        field to relationships.
        
    def field_to_native(self, obj, field_name):
        """
        Override default so that we can apply ModelSerializer as a nested
        field to relationships.
        """
        if self.source == '*':
            return self.to_native(obj)

        try:
            if self.source:
                for component in self.source.split('.'):
                    obj = getattr(obj, component)
                    if is_simple_callable(obj):
                        obj = obj()
            else:
                obj = getattr(obj, field_name)
                if is_simple_callable(obj):
                    obj = obj()
        except ObjectDoesNotExist:
            return None

        # If the object has an "all" method, assume it's a relationship
        if is_simple_callable(getattr(obj, 'all', None)):
            return [self.to_native(item) for item in obj.all()]

        if obj is None:
            return None

        return self.to_native(obj)

Field

        Given and object and a field name, returns the value that should be
        serialized for that field.
        
    def field_to_native(self, obj, field_name):
        """
        Given and object and a field name, returns the value that should be
        serialized for that field.
        """
        if obj is None:
            return self.empty

        if self.source == '*':
            return self.to_native(obj)

        if self.source:
            value = obj
            for component in self.source.split('.'):
                value = getattr(value, component)
                if is_simple_callable(value):
                    value = value()
        else:
            value = getattr(obj, field_name)
        return self.to_native(value)

def from_native(self, data, files): BaseSerializer

        Deserialize primitives -> objects.
        
    def from_native(self, data, files):
        """
        Deserialize primitives -> objects.
        """
        if hasattr(data, '__iter__') and not isinstance(data, dict):
            # TODO: error data when deserializing lists
            return [self.from_native(item, None) for item in data]

        self._errors = {}
        if data is not None or files is not None:
            attrs = self.restore_fields(data, files)
            attrs = self.perform_validation(attrs)
        else:
            self._errors['non_field_errors'] = ['No input provided']

        if not self._errors:
            return self.restore_object(attrs, instance=getattr(self, 'object', None))

def get_default_fields(self):

ModelSerializer

        Return all the fields that should be serialized for the model.
        
    def get_default_fields(self):
        """
        Return all the fields that should be serialized for the model.
        """

        cls = self.opts.model
        opts = get_concrete_model(cls)._meta
        pk_field = opts.pk
        while pk_field.rel:
            pk_field = pk_field.rel.to._meta.pk
        fields = [pk_field]
        fields += [field for field in opts.fields if field.serialize]
        fields += [field for field in opts.many_to_many if field.serialize]

        ret = SortedDict()
        nested = bool(self.opts.depth)
        is_pk = True  # First field in the list is the pk

        for model_field in fields:
            if is_pk:
                field = self.get_pk_field(model_field)
                is_pk = False
            elif model_field.rel and nested:
                field = self.get_nested_field(model_field)
            elif model_field.rel:
                to_many = isinstance(model_field,
                                     models.fields.related.ManyToManyField)
                field = self.get_related_field(model_field, to_many=to_many)
            else:
                field = self.get_field(model_field)

            if field:
                ret[model_field.name] = field

        for field_name in self.opts.read_only_fields:
            assert field_name in ret, \
                "read_only_fields on '%s' included invalid item '%s'" % \
                (self.__class__.__name__, field_name)
            ret[field_name].read_only = True

        return ret

BaseSerializer

        Return the complete set of default fields for the object, as a dict.
        
    def get_default_fields(self):
        """
        Return the complete set of default fields for the object, as a dict.
        """
        return {}

def get_field(self, model_field): ModelSerializer

        Creates a default instance of a basic non-relational field.
        
    def get_field(self, model_field):
        """
        Creates a default instance of a basic non-relational field.
        """
        kwargs = {}

        kwargs['blank'] = model_field.blank

        if model_field.null or model_field.blank:
            kwargs['required'] = False

        if isinstance(model_field, models.AutoField) or not model_field.editable:
            kwargs['read_only'] = True

        if model_field.has_default():
            kwargs['required'] = False
            kwargs['default'] = model_field.get_default()

        if model_field.__class__ == models.TextField:
            kwargs['widget'] = widgets.Textarea

        # TODO: TypedChoiceField?
        if model_field.flatchoices:  # This ModelField contains choices
            kwargs['choices'] = model_field.flatchoices
            return ChoiceField(**kwargs)

        field_mapping = {
            models.AutoField: IntegerField,
            models.FloatField: FloatField,
            models.IntegerField: IntegerField,
            models.PositiveIntegerField: IntegerField,
            models.SmallIntegerField: IntegerField,
            models.PositiveSmallIntegerField: IntegerField,
            models.DateTimeField: DateTimeField,
            models.DateField: DateField,
            models.EmailField: EmailField,
            models.CharField: CharField,
            models.URLField: URLField,
            models.SlugField: SlugField,
            models.TextField: CharField,
            models.CommaSeparatedIntegerField: CharField,
            models.BooleanField: BooleanField,
            models.FileField: FileField,
            models.ImageField: ImageField,
        }
        try:
            return field_mapping[model_field.__class__](**kwargs)
        except KeyError:
            return ModelField(model_field=model_field, **kwargs)

def get_field_key(self, field_name): BaseSerializer

        Return the key that should be used for a given field.
        
    def get_field_key(self, field_name):
        """
        Return the key that should be used for a given field.
        """
        return field_name

def get_fields(self): BaseSerializer

        Returns the complete set of fields for the object as a dict.

        This will be the set of any explicitly declared fields,
        plus the set of fields returned by get_default_fields().
        
    def get_fields(self):
        """
        Returns the complete set of fields for the object as a dict.

        This will be the set of any explicitly declared fields,
        plus the set of fields returned by get_default_fields().
        """
        ret = SortedDict()

        # Get the explicitly declared fields
        base_fields = copy.deepcopy(self.base_fields)
        for key, field in base_fields.items():
            ret[key] = field

        # Add in the default fields
        default_fields = self.get_default_fields()
        for key, val in default_fields.items():
            if key not in ret:
                ret[key] = val

        # If 'fields' is specified, use those fields, in that order.
        if self.opts.fields:
            new = SortedDict()
            for key in self.opts.fields:
                new[key] = ret[key]
            ret = new

        # Remove anything in 'exclude'
        if self.opts.exclude:
            for key in self.opts.exclude:
                ret.pop(key, None)

        for key, field in ret.items():
            field.initialize(parent=self, field_name=key)

        return ret

def get_nested_field(self, model_field): ModelSerializer

        Creates a default instance of a nested relational field.
        
    def get_nested_field(self, model_field):
        """
        Creates a default instance of a nested relational field.
        """
        class NestedModelSerializer(ModelSerializer):
            class Meta:
                model = model_field.rel.to
        return NestedModelSerializer()

def get_pk_field(self, model_field):

HyperlinkedModelSerializer

    def get_pk_field(self, model_field):
        return None

ModelSerializer

        Returns a default instance of the pk field.
        
    def get_pk_field(self, model_field):
        """
        Returns a default instance of the pk field.
        """
        return self.get_field(model_field)

def get_related_field(self, model_field, to_many):

def get_validation_exclusions(self): ModelSerializer

        Return a list of field names to exclude from model validation.
        
    def get_validation_exclusions(self):
        """
        Return a list of field names to exclude from model validation.
        """
        cls = self.opts.model
        opts = get_concrete_model(cls)._meta
        exclusions = [field.name for field in opts.fields + opts.many_to_many]
        for field_name, field in self.fields.items():
            if field_name in exclusions and not field.read_only:
                exclusions.remove(field_name)
        return exclusions

def initialize(self, parent, field_name):

BaseSerializer

        Same behaviour as usual Field, except that we need to keep track
        of state so that we can deal with handling maximum depth.
        
    def initialize(self, parent, field_name):
        """
        Same behaviour as usual Field, except that we need to keep track
        of state so that we can deal with handling maximum depth.
        """
        super(BaseSerializer, self).initialize(parent, field_name)
        if parent.opts.depth:
            self.opts.depth = parent.opts.depth - 1

Field

        Called to set up a field prior to field_to_native or field_from_native.

        parent - The parent serializer.
        model_field - The model field this field corresponds to, if one exists.
        
    def initialize(self, parent, field_name):
        """
        Called to set up a field prior to field_to_native or field_from_native.

        parent - The parent serializer.
        model_field - The model field this field corresponds to, if one exists.
        """
        self.parent = parent
        self.root = parent.root or parent
        self.context = self.root.context
        if self.root.partial:
            self.required = False

def is_valid(self): BaseSerializer

    def is_valid(self):
        return not self.errors

def perform_validation(self, attrs): BaseSerializer

        Run `validate_()` and `validate()` methods on the serializer
        
    def perform_validation(self, attrs):
        """
        Run `validate_<fieldname>()` and `validate()` methods on the serializer
        """
        for field_name, field in self.fields.items():
            if field_name in self._errors:
                continue
            try:
                validate_method = getattr(self, 'validate_%s' % field_name, None)
                if validate_method:
                    source = field.source or field_name
                    attrs = validate_method(attrs, source)
            except ValidationError as err:
                self._errors[field_name] = self._errors.get(field_name, []) + list(err.messages)

        # If there are already errors, we don't run .validate() because
        # field-validation failed and thus `attrs` may not be complete.
        # which in turn can cause inconsistent validation errors.
        if not self._errors:
            try:
                attrs = self.validate(attrs)
            except ValidationError as err:
                if hasattr(err, 'message_dict'):
                    for field_name, error_messages in err.message_dict.items():
                        self._errors[field_name] = self._errors.get(field_name, []) + list(error_messages)
                elif hasattr(err, 'messages'):
                    self._errors['non_field_errors'] = err.messages

        return attrs

def restore_fields(self, data, files): BaseSerializer

        Core of deserialization, together with `restore_object`.
        Converts a dictionary of data into a dictionary of deserialized fields.
        
    def restore_fields(self, data, files):
        """
        Core of deserialization, together with `restore_object`.
        Converts a dictionary of data into a dictionary of deserialized fields.
        """
        reverted_data = {}

        if data is not None and not isinstance(data, dict):
            self._errors['non_field_errors'] = [u'Invalid data']
            return None

        for field_name, field in self.fields.items():
            field.initialize(parent=self, field_name=field_name)
            try:
                field.field_from_native(data, files, field_name, reverted_data)
            except ValidationError as err:
                self._errors[field_name] = list(err.messages)

        return reverted_data

def restore_object(self, attrs, instance=None):

ModelSerializer

        Restore the model instance.
        
    def restore_object(self, attrs, instance=None):
        """
        Restore the model instance.
        """
        self.m2m_data = {}
        self.related_data = {}

        # Reverse fk relations
        for (obj, model) in self.opts.model._meta.get_all_related_objects_with_model():
            field_name = obj.field.related_query_name()
            if field_name in attrs:
                self.related_data[field_name] = attrs.pop(field_name)

        # Reverse m2m relations
        for (obj, model) in self.opts.model._meta.get_all_related_m2m_objects_with_model():
            field_name = obj.field.related_query_name()
            if field_name in attrs:
                self.m2m_data[field_name] = attrs.pop(field_name)

        # Forward m2m relations
        for field in self.opts.model._meta.many_to_many:
            if field.name in attrs:
                self.m2m_data[field.name] = attrs.pop(field.name)

        if instance is not None:
            for key, val in attrs.items():
                setattr(instance, key, val)

        else:
            instance = self.opts.model(**attrs)

        try:
            instance.full_clean(exclude=self.get_validation_exclusions())
        except ValidationError, err:
            self._errors = err.message_dict
            return None

        return instance

BaseSerializer

        Deserialize a dictionary of attributes into an object instance.
        You should override this method to control how deserialized objects
        are instantiated.
        
    def restore_object(self, attrs, instance=None):
        """
        Deserialize a dictionary of attributes into an object instance.
        You should override this method to control how deserialized objects
        are instantiated.
        """
        if instance is not None:
            instance.update(attrs)
            return instance
        return attrs

def save(self):

ModelSerializer

        Save the deserialized object and return it.
        
    def save(self):
        """
        Save the deserialized object and return it.
        """
        self.object.save()

        if getattr(self, 'm2m_data', None):
            for accessor_name, object_list in self.m2m_data.items():
                setattr(self.object, accessor_name, object_list)
            self.m2m_data = {}

        if getattr(self, 'related_data', None):
            for accessor_name, object_list in self.related_data.items():
                setattr(self.object, accessor_name, object_list)
            self.related_data = {}

        return self.object

BaseSerializer

        Save the deserialized object and return it.
        
    def save(self):
        """
        Save the deserialized object and return it.
        """
        self.object.save()
        return self.object

def to_native(self, obj):

BaseSerializer

        Serialize objects -> primitives.
        
    def to_native(self, obj):
        """
        Serialize objects -> primitives.
        """
        # Note: At the moment we have an ugly hack to determine if we should
        # walk over iterables.  At some point, serializers will require an
        # explicit `many=True` in order to iterate over a set, and this hack
        # will disappear.
        if hasattr(obj, '__iter__') and not isinstance(obj, Page):
            return [self.convert_object(item) for item in obj]
        return self.convert_object(obj)

Field

        Converts the field's value into it's simple representation.
        
    def to_native(self, value):
        """
        Converts the field's value into it's simple representation.
        """
        if is_simple_callable(value):
            value = value()

        if is_protected_type(value):
            return value
        elif hasattr(value, '__iter__') and not isinstance(value, (dict, basestring)):
            return [self.to_native(item) for item in value]
        elif isinstance(value, dict):
            return dict(map(self.to_native, (k, v)) for k, v in value.items())
        return smart_unicode(value)

def validate(self, attrs): BaseSerializer

        Stub method, to be overridden in Serializer subclasses
        
    def validate(self, attrs):
        """
        Stub method, to be overridden in Serializer subclasses
        """
        return attrs