Esempio n. 1
0
    def field_to_native(self, obj, field_name):
        """
        Override default so that the serializer can be used as a nested field
        across relationships.
        """
        from rest_framework.serializers import ObjectDoesNotExist, get_component, is_simple_callable

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

        try:
            source = self.source or field_name
            value = obj

            for component in source.split('.'):
                value = get_component(value, component)
                if value is None:
                    break
        except ObjectDoesNotExist:
            return None

        if is_simple_callable(getattr(value, 'all', None)):
            return self.many_to_native(value.all())

        if value is None:
            return None

        if self.many is not None:
            many = self.many
        else:
            many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type))

        if many:
            return self.many_to_native(value)
        return self.to_native(value)
Esempio n. 2
0
    def field_to_native(self, obj, field_name):
        """
        Override default so that the serializer can be used as a nested field
        across relationships.
        """
        from rest_framework.serializers import ObjectDoesNotExist, get_component, is_simple_callable

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

        try:
            source = self.source or field_name
            value = obj

            for component in source.split('.'):
                value = get_component(value, component)
                if value is None:
                    break
        except ObjectDoesNotExist:
            return None

        if is_simple_callable(getattr(value, 'all', None)):
            return self.many_to_native(value.all())

        if value is None:
            return None

        if self.many is not None:
            many = self.many
        else:
            many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type))

        if many:
            return self.many_to_native(value)
        return self.to_native(value)
Esempio n. 3
0
    def to_native(self, obj):
        """
        Serialize objects -> primitives.
        """
        if is_simple_callable(getattr(obj, 'all', None)):
            ret = [super(RemoteFieldsModelSerializerMixin, self).to_native(i)
                   for i in obj.all()]
        else:
            ret = super(RemoteFieldsModelSerializerMixin, self).to_native(obj)

        for field_name, field in self.get_remote_serializers():
            obj_field = getattr(obj, field_name, None)
            ret[field_name] = field.__class__(obj_field).data

        return ret