summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Sokolovskiy <me@asokolovskiy.com>2015-05-29 14:45:36 +0300
committerTim Graham <timograham@gmail.com>2015-06-02 09:54:53 -0400
commit2913d6b77d8b2082dc79df5503b7dd3ddd05fcc1 (patch)
treed398a8d601c48e8b1891fb8542f9a6b5999f596e
parente1e6399c2ce39a3656155c4d704340eac83926a7 (diff)
Fixed #24831 -- Fixed pickling queryset with prefetch_related() after deleting objects.
-rw-r--r--django/db/models/fields/related.py5
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/queryset_pickle/tests.py14
3 files changed, 22 insertions, 0 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 15d032dc1f..a3183b331f 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -1471,6 +1471,11 @@ class ManyToOneRel(ForeignObjectRel):
self.field_name = field_name
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ state.pop('related_model', None)
+ return state
+
def get_related_field(self):
"""
Return the Field in the 'to' object to which this relationship is tied.
diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt
index c2a4f6af3d..78e6766872 100644
--- a/docs/releases/1.8.3.txt
+++ b/docs/releases/1.8.3.txt
@@ -37,3 +37,6 @@ Bugfixes
* Fixed lack of unique constraint when changing a field from
``primary_key=True`` to ``unique=True`` (:ticket:`24893`).
+
+* Fixed queryset pickling when using ``prefetch_related()`` after deleting
+ objects (:ticket:`24831`).
diff --git a/tests/queryset_pickle/tests.py b/tests/queryset_pickle/tests.py
index 5e42d90520..6ac51c8431 100644
--- a/tests/queryset_pickle/tests.py
+++ b/tests/queryset_pickle/tests.py
@@ -119,6 +119,20 @@ class PickleabilityTestCase(TestCase):
groups = pickle.loads(pickle.dumps(groups))
self.assertQuerysetEqual(groups, [g], lambda x: x)
+ def test_pickle_prefetch_related_with_m2m_and_objects_deletion(self):
+ """
+ #24831 -- Cached properties on ManyToOneRel created in QuerySet.delete()
+ caused subsequent QuerySet pickling to fail.
+ """
+ g = Group.objects.create(name='foo')
+ m2m = M2MModel.objects.create()
+ m2m.groups.add(g)
+ Group.objects.all().delete()
+
+ m2ms = M2MModel.objects.prefetch_related('groups')
+ m2ms = pickle.loads(pickle.dumps(m2ms))
+ self.assertQuerysetEqual(m2ms, [m2m], lambda x: x)
+
def test_missing_django_version_unpickling(self):
"""
#21430 -- Verifies a warning is raised for querysets that are