Ticket #4656: base.py

File base.py, 2.7 KB (added by Matthew Flanagan <mattimustang@…>, 7 years ago)
Line 
1"""New base serializer class to handle full serialization of model objects."""
2try:
3    from cStringIO import StringIO
4except ImportError:
5    from StringIO import StringIO
6
7from django.core.serializers import base
8
9
10class Serializer(base.Serializer):
11    """Serializer for Django models inspired by Ruby on Rails serializer.
12
13    """
14
15    def __init__(self, *args, **kwargs):
16        """Declare instance attributes."""
17        self.options = None
18        self.stream = None
19        self.fields = None
20        self.excludes = None
21        self.relations = None
22        self.extras = None
23        super(Serializer, self).__init__(*args, **kwargs)
24
25    def serialize(self, queryset, **options):
26        """Serialize a queryset with the following options allowed:
27            fields - list of fields to be serialized. If not provided then all
28                fields are serialized.
29            excludes - list of fields to be excluded. Overrides ``fields``.
30            relations - list of related fields to be fully serialized.
31            extras - list of attributes and methods to include.
32                Methods cannot take arguments.
33        """
34        self.options = options
35        self.stream = options.get("stream", StringIO())
36        self.fields = options.get("fields", [])
37        self.excludes = options.get("excludes", [])
38        self.relations = options.get("relations", [])
39        self.extras = options.get("extras", [])
40
41        self.start_serialization()
42        for obj in queryset:
43            self.start_object(obj)
44            for field in obj._meta.local_fields:
45                attname = field.attname
46                if field.serialize:
47                    if field.rel is None:
48                        if attname not in self.excludes:
49                            if not self.fields or attname in self.fields:
50                                self.handle_field(obj, field)
51                    else:
52                        if attname[:-3] not in self.excludes:
53                            if not self.fields or attname[:-3] in self.fields:
54                                self.handle_fk_field(obj, field)
55            for field in obj._meta.many_to_many:
56                if field.serialize:
57                    if field.attname not in self.excludes:
58                        if not self.fields or field.attname in self.fields:
59                            self.handle_m2m_field(obj, field)
60            for extra in self.extras:
61                self.handle_extra_field(obj, extra)
62            self.end_object(obj)
63        self.end_serialization()
64        return self.getvalue()
65
66    def handle_extra_field(self, obj, extra):
67        """Called to handle 'extras' field serialization."""
68        raise NotImplementedError
Back to Top