summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Gaynor <alex.gaynor@gmail.com>2011-06-07 20:51:59 +0000
committerAlex Gaynor <alex.gaynor@gmail.com>2011-06-07 20:51:59 +0000
commitfcf8312ade4375faf6027afe610fb76bcdead084 (patch)
tree8c267f05939060314247e9011a19d567193c3803
parent684b0396cfff1c4343a83bd600db69af9188986d (diff)
Made clear() on a reverse foreign key significantly more efficient. Thanks to Andrew Godwin for the review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16335 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/fields/related.py4
-rw-r--r--tests/modeltests/many_to_one/tests.py6
-rw-r--r--tests/modeltests/many_to_one_null/tests.py12
3 files changed, 16 insertions, 6 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index ffa5692646..cedf3088c4 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -459,9 +459,7 @@ class ForeignRelatedObjectsDescriptor(object):
remove.alters_data = True
def clear(self):
- for obj in self.all():
- setattr(obj, rel_field.name, None)
- obj.save()
+ self.update(**{rel_field.name: None})
clear.alters_data = True
manager = RelatedManager()
diff --git a/tests/modeltests/many_to_one/tests.py b/tests/modeltests/many_to_one/tests.py
index 2d474c0ddb..8a2af2157b 100644
--- a/tests/modeltests/many_to_one/tests.py
+++ b/tests/modeltests/many_to_one/tests.py
@@ -1,10 +1,13 @@
+from copy import deepcopy
from datetime import datetime
+
from django.test import TestCase
from django.core.exceptions import FieldError
+
from models import Article, Reporter
-class ManyToOneTests(TestCase):
+class ManyToOneTests(TestCase):
def setUp(self):
# Create a few Reporters.
self.r = Reporter(first_name='John', last_name='Smith', email='john@example.com')
@@ -368,5 +371,4 @@ class ManyToOneTests(TestCase):
# Regression for #12876 -- Model methods that include queries that
# recursive don't cause recursion depth problems under deepcopy.
self.r.cached_query = Article.objects.filter(reporter=self.r)
- from copy import deepcopy
self.assertEqual(repr(deepcopy(self.r)), "<Reporter: John Smith>")
diff --git a/tests/modeltests/many_to_one_null/tests.py b/tests/modeltests/many_to_one_null/tests.py
index c78f980871..0850cca2b1 100644
--- a/tests/modeltests/many_to_one_null/tests.py
+++ b/tests/modeltests/many_to_one_null/tests.py
@@ -1,8 +1,10 @@
+from __future__ import with_statement
+
from django.test import TestCase
from models import Reporter, Article
-class ManyToOneNullTests(TestCase):
+class ManyToOneNullTests(TestCase):
def setUp(self):
# Create a Reporter.
self.r = Reporter(name='John Smith')
@@ -82,3 +84,11 @@ class ManyToOneNullTests(TestCase):
self.assertQuerysetEqual(self.r.article_set.all(), [])
self.assertQuerysetEqual(Article.objects.filter(reporter__isnull=True),
['<Article: First>', '<Article: Fourth>'])
+
+ def test_remove_efficiency(self):
+ r = Reporter.objects.create()
+ for _ in xrange(3):
+ r.article_set.create()
+ with self.assertNumQueries(1):
+ r.article_set.clear()
+ self.assertEqual(r.article_set.count(), 0) \ No newline at end of file