示例#1
0
def test_serialization():
    from django.core.serializers.python import Serializer as PythonSerializer
    m = MyModel(color=Color.RED, taste=Taste.SALTY)
    ser = PythonSerializer()
    ser.serialize([m])
    fields = ser.getvalue()[0]["fields"]
    assert fields["color"] == m.color.value
    assert fields["taste"] == m.taste.value
def test_serialization():
    from django.core.serializers.python import Serializer as PythonSerializer
    m = MyModel(color=MyModel.Color.RED, taste=MyModel.Taste.SALTY)
    ser = PythonSerializer()
    ser.serialize([m])
    fields = ser.getvalue()[0]["fields"]
    assert fields["color"] == m.color.value
    assert fields["taste"] == m.taste.value
示例#3
0
    def serialize(self, obj, fields):
        """
        Serializes a single model instance to a Python dict, based on the specified list of fields.
        """

        data = {}
        remaining_fields = []
        for field in fields:
            if callable(field):  # Callable
                data[field.__name__] = field(obj)
            elif hasattr(self, field) and callable(getattr(
                    self, field)):  # Method on the view
                data[field] = getattr(self, field)(obj)
            elif hasattr(obj, field):  # Callable/property/field on the model
                attr = getattr(obj, field)
                if isinstance(attr, Model):
                    data[field] = attr.pk
                elif isinstance(attr, Manager):
                    data[field] = [item['pk'] for item in attr.values('pk')]
                elif callable(attr):  # Callable on the model
                    data[field] = attr()
                else:
                    remaining_fields.append(field)
            else:
                raise AttributeError('Invalid field: %s' % field)

        # Add on db fields
        serializer = Serializer()
        serializer.serialize([obj], fields=list(remaining_fields))
        data.update(serializer.getvalue()[0]['fields'])

        # Any remaining fields should be properties on the model
        remaining_fields = set(remaining_fields) - set(data.keys())

        for field in remaining_fields:
            data[field] = getattr(obj, field)

        return data
示例#4
0
    def serialize(self, obj, fields):
        """
        Serializes a single model instance to a Python dict, based on the specified list of fields.
        """

        data = {}
        remaining_fields = []
        for field in fields:
            if callable(field):  # Callable
                data[field.__name__] = field(obj)
            elif hasattr(self, field) and callable(getattr(self, field)):  # Method on the view
                data[field] = getattr(self, field)(obj)
            elif hasattr(obj, field):  # Callable/property/field on the model
                attr = getattr(obj, field)
                if isinstance(attr, Model):
                    data[field] = attr.pk
                elif isinstance(attr, Manager):
                    data[field] = [item['pk'] for item in attr.values('pk')]
                elif callable(attr):  # Callable on the model
                    data[field] = attr()
                else:
                    remaining_fields.append(field)
            else:
                raise AttributeError('Invalid field: %s' % field)

        # Add on db fields
        serializer = Serializer()
        serializer.serialize([obj], fields=list(remaining_fields))
        data.update(serializer.getvalue()[0]['fields'])

        # Any remaining fields should be properties on the model
        remaining_fields = set(remaining_fields) - set(data.keys())

        for field in remaining_fields:
            data[field] = getattr(obj, field)

        return data