summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHonza Král <Honza.Kral@gmail.com>2013-02-23 06:55:09 -0800
committerHonza Král <Honza.Kral@gmail.com>2013-02-23 06:55:09 -0800
commit6cb6e1128f090d5edde9918ba2ae79c1e38b65ad (patch)
tree3884b2e022797f8ab201ae119e13323e1f95bf30
parent722683f508566cf06bcc85f9f1810c3cde80344c (diff)
parent3dddbc0f2380d2654e66c8df4bb40d5e1d42af98 (diff)
Merge pull request #769 from oinopion/ticket19816
Fixed #19816 -- pre-evaluate queryset on m2m set
-rw-r--r--django/db/models/fields/related.py3
-rw-r--r--tests/regressiontests/m2m_regress/tests.py15
2 files changed, 17 insertions, 1 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index bea88ba337..01b8a550d1 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -904,6 +904,9 @@ class ReverseManyRelatedObjectsDescriptor(object):
raise AttributeError("Cannot set values on a ManyToManyField which specifies an intermediary model. Use %s.%s's Manager instead." % (opts.app_label, opts.object_name))
manager = self.__get__(instance)
+ # clear() can change expected output of 'value' queryset, we force evaluation
+ # of queryset before clear; ticket #19816
+ value = tuple(value)
manager.clear()
manager.add(*value)
diff --git a/tests/regressiontests/m2m_regress/tests.py b/tests/regressiontests/m2m_regress/tests.py
index 3dc1d2417c..90aab5e2a5 100644
--- a/tests/regressiontests/m2m_regress/tests.py
+++ b/tests/regressiontests/m2m_regress/tests.py
@@ -5,7 +5,7 @@ from django.test import TestCase
from django.utils import six
from .models import (SelfRefer, Tag, TagCollection, Entry, SelfReferChild,
- SelfReferChildSibling, Worksheet, RegressionModelSplit)
+ SelfReferChildSibling, Worksheet, RegressionModelSplit, Line)
class M2MRegressionTests(TestCase):
@@ -96,3 +96,16 @@ class M2MRegressionTests(TestCase):
# causes a TypeError in add_lazy_relation
m1 = RegressionModelSplit(name='1')
m1.save()
+
+ def test_m2m_filter(self):
+ worksheet = Worksheet.objects.create(id=1)
+ line_hi = Line.objects.create(name="hi")
+ line_bye = Line.objects.create(name="bye")
+
+ worksheet.lines = [line_hi, line_bye]
+ hi = worksheet.lines.filter(name="hi")
+
+ worksheet.lines = hi
+ self.assertEquals(1, worksheet.lines.count())
+ self.assertEquals(1, hi.count())
+