Skip to content

Instantly share code, notes, and snippets.

@Nagyman
Created July 18, 2012 18:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nagyman/3138086 to your computer and use it in GitHub Desktop.
Save Nagyman/3138086 to your computer and use it in GitHub Desktop.
django-reversion createinitialrevisions performance improvement
from optparse import make_option
+from django.db import reset_queries
from django.core.exceptions import ImproperlyConfigured
from django.core.management.base import BaseCommand
from django.core.management.base import CommandError
@@ -93,17 +94,28 @@ class Command(BaseCommand):
live_objs = live_objs.exclude(
pk__in = list(versioned_pk_queryset.values_list("object_id", flat=True).iterator())
)
+
# Save all the versions.
- for obj in live_objs:
- try:
- default_revision_manager.save_revision((obj,), comment=comment)
- except:
- print "ERROR: Could not save initial version for %s %s." % (model_class.__name__, obj.pk)
- raise
- created_count += 1
+ ids = list(live_objs.values_list(model_class._meta.pk.name, flat=True))
+ total = len(ids)
+ batchsize = 500
+ from django.core.paginator import Paginator
+ paginator = Paginator(ids, batchsize)
+ for page_num in paginator.page_range:
+ page = paginator.page(page_num)
+ objects = live_objs.in_bulk(page.object_list)
+ print '%s of %s' % (page.start_index(), total)
+ for id, obj in objects.iteritems():
+ try:
+ default_revision_manager.save_revision((obj,), comment=comment)
+ except:
+ print "ERROR: Could not save initial version for %s %s." % (model_class.__name__, obj.pk)
+ raise
+ created_count += 1
+
# Print out a message, if feeling verbose.
if verbosity >= 2:
print u"Created %s initial revision(s) for model %s." % (created_count, smart_unicode(model_class._meta.verbose_name))
else:
if verbosity >= 2:
- print u"Model %s is not registered." % (smart_unicode(model_class._meta.verbose_name))
\ No newline at end of file
+ print u"Model %s is not registered." % (smart_unicode(model_class._meta.verbose_name))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment