summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2011-12-09 23:16:56 +0000
committerAdrian Holovaty <adrian@holovaty.com>2011-12-09 23:16:56 +0000
commit073d987a84d7ebdf3b70789f22b8a12a9f5ae96f (patch)
tree68b8366679230f95e95d7f527b0ed752eeb4e563 /django
parent594a45ed292d79901d45252603dc8e7a5d991d22 (diff)
Fixed #16818 -- Fixed ORM bug with many-to-many add() method where it wasn't committing the change. Thanks, pressureman and kmtracey
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17189 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/db/models/query.py33
1 files changed, 22 insertions, 11 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 1b8636276a..c752049dcc 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -396,18 +396,29 @@ class QuerySet(object):
self._for_write = True
connection = connections[self.db]
fields = self.model._meta.local_fields
- if (connection.features.can_combine_inserts_with_and_without_auto_increment_pk
- and self.model._meta.has_auto_field):
- self.model._base_manager._insert(objs, fields=fields, using=self.db)
+ if not transaction.is_managed(using=self.db):
+ transaction.enter_transaction_management(using=self.db)
+ forced_managed = True
else:
- objs_with_pk, objs_without_pk = partition(
- lambda o: o.pk is None,
- objs
- )
- if objs_with_pk:
- self.model._base_manager._insert(objs_with_pk, fields=fields, using=self.db)
- if objs_without_pk:
- self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db)
+ forced_managed = False
+ try:
+ if (connection.features.can_combine_inserts_with_and_without_auto_increment_pk
+ and self.model._meta.has_auto_field):
+ self.model._base_manager._insert(objs, fields=fields, using=self.db)
+ else:
+ objs_with_pk, objs_without_pk = partition(lambda o: o.pk is None, objs)
+ if objs_with_pk:
+ self.model._base_manager._insert(objs_with_pk, fields=fields, using=self.db)
+ if objs_without_pk:
+ self.model._base_manager._insert(objs_without_pk, fields=[f for f in fields if not isinstance(f, AutoField)], using=self.db)
+ if forced_managed:
+ transaction.commit(using=self.db)
+ else:
+ transaction.commit_unless_managed(using=self.db)
+ finally:
+ if forced_managed:
+ transaction.leave_transaction_management(using=self.db)
+
return objs
def get_or_create(self, **kwargs):