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 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 get_dump_object(self, obj): """ Serializer patch method to get access to model instance. Triggers instance media dump by sending the `pre_dump` signal. """ pre_dump.send(sender=type(obj), instance=obj) return Serializer.get_dump_object(self, obj)
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
from collections import Iterable from typing import Sequence from uuid import uuid4 from django.core.serializers.python import Serializer, Deserializer from django.core.exceptions import ObjectDoesNotExist from django.http import Http404 from django.db.models import Model from django.shortcuts import get_object_or_404 from django_shift.resources import APIResource from django.db import models serializer = Serializer() DJANGO_FIELD_TO_CERBERUS = { 'default': 'string', models.BooleanField: 'boolean' } class APIModelResource(APIResource): model = None # type: Model fields = None # type: Sequence[str] def __init__(self, *args, **kwargs): super(APIModelResource, self).__init__(*args, **kwargs) if not self.pk_field: self.pk_field = self.model._meta.pk.name
def start_serialization(self): self.options.pop('stream', None) self.options.pop('fields', None) PythonSerializer.start_serialization(self)