Code

Ticket #5423: django_dumpdata_streamed_output_2.diff

File django_dumpdata_streamed_output_2.diff, 4.8 KB (added by Bastian Kleineidam <calvin@…>, 6 years ago)

Cleanup up revision, using objects.iterator()

Line 
1Index: django/core/serializers/json.py
2===================================================================
3--- django/core/serializers/json.py     (Revision 6526)
4+++ django/core/serializers/json.py     (Arbeitskopie)
5@@ -4,7 +4,6 @@
6 
7 import datetime
8 from django.utils import simplejson
9-from django.utils.simplejson import decoder
10 from django.core.serializers.python import Serializer as PythonSerializer
11 from django.core.serializers.python import Deserializer as PythonDeserializer
12 try:
13@@ -20,15 +19,34 @@
14     """
15     Convert a queryset to JSON.
16     """
17+    def start_serialization(self):
18+        self._current = None
19+        self.json_kwargs = self.options.copy()
20+        self.json_kwargs.pop('stream', None)
21+        self.json_kwargs.pop('fields', None)
22+        self.stream.write("[")
23+
24     def end_serialization(self):
25-        self.options.pop('stream', None)
26-        self.options.pop('fields', None)
27-        simplejson.dump(self.objects, self.stream, cls=DjangoJSONEncoder, **self.options)
28+        if self.options.get("indent"):
29+            self.stream.write("\n")
30+        self.stream.write("]\n")
31 
32+    def end_object(self, obj):
33+        # self._current has the field data
34+        if not self.first:
35+            self.stream.write(",")
36+        if self.options.get("indent"):
37+            self.stream.write("\n")
38+        simplejson.dump(self.get_dump_object(obj), self.stream,
39+                        cls=DjangoJSONEncoder, **self.json_kwargs)
40+        self._current = None
41+
42     def getvalue(self):
43+        # overwrite PythonSerializer.getvalue() with base Serializer.getvalue()
44         if callable(getattr(self.stream, 'getvalue', None)):
45             return self.stream.getvalue()
46 
47+
48 def Deserializer(stream_or_string, **options):
49     """
50     Deserialize a stream or string of JSON data.
51Index: django/core/serializers/base.py
52===================================================================
53--- django/core/serializers/base.py     (Revision 6526)
54+++ django/core/serializers/base.py     (Arbeitskopie)
55@@ -32,6 +32,7 @@
56         self.selected_fields = options.get("fields")
57 
58         self.start_serialization()
59+        self.first = True
60         for obj in queryset:
61             self.start_object(obj)
62             for field in obj._meta.fields:
63@@ -47,6 +48,8 @@
64                     if self.selected_fields is None or field.attname in self.selected_fields:
65                         self.handle_m2m_field(obj, field)
66             self.end_object(obj)
67+            if self.first:
68+                self.first = False
69         self.end_serialization()
70         return self.getvalue()
71 
72Index: django/core/serializers/python.py
73===================================================================
74--- django/core/serializers/python.py   (Revision 6526)
75+++ django/core/serializers/python.py   (Arbeitskopie)
76@@ -25,15 +25,19 @@
77         self._current = {}
78 
79     def end_object(self, obj):
80-        self.objects.append({
81+        self.objects.append(self.get_dump_object(obj))
82+        self._current = None
83+
84+    def get_dump_object (self, obj):
85+        return {
86             "model"  : smart_unicode(obj._meta),
87             "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
88             "fields" : self._current
89-        })
90-        self._current = None
91+        }
92 
93     def handle_field(self, obj, field):
94-        self._current[field.name] = smart_unicode(getattr(obj, field.name), strings_only=True)
95+        value = self.get_string_value(obj, field)
96+        self._current[field.name] = smart_unicode(value)
97 
98     def handle_fk_field(self, obj, field):
99         related = getattr(obj, field.name)
100Index: django/core/management/commands/dumpdata.py
101===================================================================
102--- django/core/management/commands/dumpdata.py (Revision 6526)
103+++ django/core/management/commands/dumpdata.py (Arbeitskopie)
104@@ -1,7 +1,8 @@
105 from django.core.management.base import BaseCommand, CommandError
106-
107 from optparse import make_option
108+import sys
109 
110+
111 class Command(BaseCommand):
112     option_list = BaseCommand.option_list + (
113         make_option('--format', default='json', dest='format',
114@@ -31,11 +32,12 @@
115         except KeyError:
116             raise CommandError("Unknown serialization format: %s" % format)
117 
118-        objects = []
119-        for app in app_list:
120-            for model in get_models(app):
121-                objects.extend(model.objects.all())
122+        def get_objects ():
123+            for app in app_list:
124+                for model in get_models(app):
125+                    for obj in model.objects.order_by(model._meta.pk.attname).iterator():
126+                        yield obj
127         try:
128-            return serializers.serialize(format, objects, indent=indent)
129+            serializers.serialize(format, get_objects(), indent=indent, stream=sys.stdout)
130         except Exception, e:
131             raise CommandError("Unable to serialize database: %s" % e)
132