diff options
| author | Honza Král <Honza.Kral@gmail.com> | 2013-02-23 06:55:09 -0800 |
|---|---|---|
| committer | Honza Král <Honza.Kral@gmail.com> | 2013-02-23 06:55:09 -0800 |
| commit | 6cb6e1128f090d5edde9918ba2ae79c1e38b65ad (patch) | |
| tree | 3884b2e022797f8ab201ae119e13323e1f95bf30 | |
| parent | 722683f508566cf06bcc85f9f1810c3cde80344c (diff) | |
| parent | 3dddbc0f2380d2654e66c8df4bb40d5e1d42af98 (diff) | |
Merge pull request #769 from oinopion/ticket19816
Fixed #19816 -- pre-evaluate queryset on m2m set
| -rw-r--r-- | django/db/models/fields/related.py | 3 | ||||
| -rw-r--r-- | tests/regressiontests/m2m_regress/tests.py | 15 |
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()) + |
