Code

Ticket #5423: django_dumpdata_streamed_output.diff

File django_dumpdata_streamed_output.diff, 5.4 KB (added by Bastian Kleineidam <calvin@…>, 7 years ago)

streamed json output

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