From 8d54d4db938f5e90ace147067ef5e87bd99b2192 Mon Sep 17 00:00:00 2001 From: Stian Jensen Date: Thu, 18 Jul 2024 13:39:37 +0200 Subject: [PATCH] Re-introduce bulk_create on supported databases This fixes #924. --- reversion/revisions.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/reversion/revisions.py b/reversion/revisions.py index a418baa1..7b7a7ff8 100644 --- a/reversion/revisions.py +++ b/reversion/revisions.py @@ -5,7 +5,7 @@ from django.apps import apps from django.core import serializers from django.core.exceptions import ObjectDoesNotExist -from django.db import models, transaction, router +from django.db import models, transaction, router, connections from django.db.models.query import QuerySet from django.db.models.signals import post_save, m2m_changed from django.utils.encoding import force_str @@ -211,6 +211,7 @@ def add_to_revision(obj, model_db=None): def _save_revision(versions, user=None, comment="", meta=(), date_created=None, using=None): from reversion.models import Revision + from reversion.models import Version # Only save versions that exist in the database. # Use _base_manager so we don't have problems when _default_manager is overriden model_db_pks = defaultdict(lambda: defaultdict(set)) @@ -248,9 +249,17 @@ def _save_revision(versions, user=None, comment="", meta=(), date_created=None, # Save the revision. revision.save(using=using) # Save version models. + + can_use_bulk_create = connections[using].features.can_return_rows_from_bulk_insert + for version in versions: version.revision = revision - version.save(using=using) + if not can_use_bulk_create: + version.save() + + if can_use_bulk_create: + Version.objects.using(using).bulk_create(versions) + # Save the meta information. for meta_model, meta_fields in meta: meta_model._base_manager.db_manager(using=using).create(