From 23b23966dcf8b0b2e13400ce8c002638d8eb1be4 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/reversion/revisions.py b/reversion/revisions.py index a418baa1..50efc622 100644 --- a/reversion/revisions.py +++ b/reversion/revisions.py @@ -1,4 +1,5 @@ from contextvars import ContextVar +from django.db import connections from collections import namedtuple, defaultdict from contextlib import contextmanager from functools import wraps @@ -211,6 +212,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 +250,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 = connection[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(