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)), "") 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), ['', '']) + + 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