summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2013-09-26 21:16:50 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2013-10-05 23:07:52 +0300
commit1df3c49a1a1c11198d181ddd0ce31bbb42e631d8 (patch)
tree5a778f559fc9b819466cfeb2d00db40019b27ef1 /django
parent93cc6dcdac6fc3e506640fa38dd1798c3cd61cff (diff)
Fixed #21174 -- transaction control in related manager methods
Diffstat (limited to 'django')
-rw-r--r--django/contrib/contenttypes/generic.py6
-rw-r--r--django/db/models/fields/related.py18
2 files changed, 13 insertions, 11 deletions
diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py
index 1fdb1f1894..51eed3f28b 100644
--- a/django/contrib/contenttypes/generic.py
+++ b/django/contrib/contenttypes/generic.py
@@ -372,14 +372,12 @@ def create_generic_related_manager(superclass):
def remove(self, *objs):
db = router.db_for_write(self.model, instance=self.instance)
- for obj in objs:
- obj.delete(using=db)
+ self.using(db).filter(pk__in=[o.pk for o in objs]).delete()
remove.alters_data = True
def clear(self):
db = router.db_for_write(self.model, instance=self.instance)
- for obj in self.all():
- obj.delete(using=db)
+ self.using(db).delete()
clear.alters_data = True
def create(self, **kwargs):
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index aa2a83bd97..8252cce672 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -1,6 +1,6 @@
from operator import attrgetter
-from django.db import connection, connections, router
+from django.db import connection, connections, router, transaction
from django.db.backends import utils
from django.db.models import signals
from django.db.models.fields import (AutoField, Field, IntegerField,
@@ -18,7 +18,6 @@ from django import forms
RECURSIVE_RELATIONSHIP_CONSTANT = 'self'
-
def add_lazy_relation(cls, field, relation, operation):
"""
Adds a lookup on ``cls`` when a related field is defined using a string,
@@ -416,11 +415,16 @@ def create_foreign_related_manager(superclass, rel_field, rel_model):
return qs, rel_obj_attr, instance_attr, False, cache_name
def add(self, *objs):
- for obj in objs:
- if not isinstance(obj, self.model):
- raise TypeError("'%s' instance expected, got %r" % (self.model._meta.object_name, obj))
- setattr(obj, rel_field.name, self.instance)
- obj.save()
+ objs = list(objs)
+ db = router.db_for_write(self.model, instance=self.instance)
+ with transaction.commit_on_success_unless_managed(
+ using=db, savepoint=False):
+ for obj in objs:
+ if not isinstance(obj, self.model):
+ raise TypeError("'%s' instance expected, got %r" %
+ (self.model._meta.object_name, obj))
+ setattr(obj, rel_field.name, self.instance)
+ obj.save()
add.alters_data = True
def create(self, **kwargs):