Source code for core.serializers

# -*- coding: utf-8 -*-
"""
Contains a special serializer with can be used for
serializing all fields including inherited fields.

:subtitle:`Class definitions:`
"""
from StringIO import StringIO

from django.core.serializers.python import Serializer as PythonSerializer
from django.db.models.fields import FieldDoesNotExist
from django.db.models.fields.related import OneToOneRel


[docs]class AllFieldsSerializer(PythonSerializer): """ Supports serialization of fields on the model that are inherited (ie. non-local fields). """ # Copied from django.core.serializers.base # Unfortunately, django's serializer only serializes local fields # NOTE: This differs from django's # serializer as it REQUIRES `fields` to be specified.
[docs] def serialize(self, queryset, fields, **options): """ Serialize a queryset. """ self.options = options self.stream = options.pop("stream", StringIO()) self.selected_fields = fields self.use_natural_primary_keys = options.pop("use_natural_keys", False) self.use_natural_foreign_keys = False self.start_serialization() for obj in queryset: self.start_object(obj) for field_name in self.selected_fields: try: field = obj._meta.get_field(field_name) except FieldDoesNotExist: continue if field in obj._meta.many_to_many: self.handle_m2m_field(obj, field) elif hasattr(field, 'rel'): if field.rel is not None: self.handle_fk_field(obj, field) else: self.handle_field(obj, field) elif isinstance(field, OneToOneRel): pass else: self.handle_field(obj, field) self.end_object(obj) self.end_serialization() return self.getvalue()