diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2013-09-26 21:16:50 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-10-05 23:07:52 +0300 |
| commit | 1df3c49a1a1c11198d181ddd0ce31bbb42e631d8 (patch) | |
| tree | 5a778f559fc9b819466cfeb2d00db40019b27ef1 /django | |
| parent | 93cc6dcdac6fc3e506640fa38dd1798c3cd61cff (diff) | |
Fixed #21174 -- transaction control in related manager methods
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/contenttypes/generic.py | 6 | ||||
| -rw-r--r-- | django/db/models/fields/related.py | 18 |
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): |
