diff options
| author | Alex Gaynor <alex.gaynor@gmail.com> | 2011-06-07 20:51:59 +0000 |
|---|---|---|
| committer | Alex Gaynor <alex.gaynor@gmail.com> | 2011-06-07 20:51:59 +0000 |
| commit | fcf8312ade4375faf6027afe610fb76bcdead084 (patch) | |
| tree | 8c267f05939060314247e9011a19d567193c3803 | |
| parent | 684b0396cfff1c4343a83bd600db69af9188986d (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.py | 4 | ||||
| -rw-r--r-- | tests/modeltests/many_to_one/tests.py | 6 | ||||
| -rw-r--r-- | tests/modeltests/many_to_one_null/tests.py | 12 |
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 |
