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
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
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