summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2013-05-21 11:06:49 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2013-05-21 11:45:24 +0300
commitbac187c0d8e829fb3ca2ca82965eabbcbcb6ddd5 (patch)
tree68c928525813836104b4587cb217c45efec9f735 /tests
parent63cab03f6ddd9faa5a770ae08791b2a70aa0a578 (diff)
[1.5.x] Fixed prefetch_related + pickle regressions
There were a couple of regressions related to field pickling. The regressions were introduced by QuerySet._known_related_objects caching. The regressions aren't present in master, the fix was likely in f403653cf146384946e5c879ad2a351768ebc226. Fixed #20157, fixed #20257. Also made QuerySets with model=None picklable.
Diffstat (limited to 'tests')
-rw-r--r--tests/regressiontests/queryset_pickle/models.py13
-rw-r--r--tests/regressiontests/queryset_pickle/tests.py29
2 files changed, 41 insertions, 1 deletions
diff --git a/tests/regressiontests/queryset_pickle/models.py b/tests/regressiontests/queryset_pickle/models.py
index d3500c903b..871fdd8a11 100644
--- a/tests/regressiontests/queryset_pickle/models.py
+++ b/tests/regressiontests/queryset_pickle/models.py
@@ -36,3 +36,16 @@ class Happening(models.Model):
number2 = models.IntegerField(blank=True, default=Numbers.get_static_number)
number3 = models.IntegerField(blank=True, default=Numbers.get_class_number)
number4 = models.IntegerField(blank=True, default=nn.get_member_number)
+
+class Person(models.Model):
+ name = models.CharField(max_length=200)
+
+class SocialProfile(models.Model):
+ person = models.ForeignKey(Person)
+ friends = models.ManyToManyField('self')
+
+class Post(models.Model):
+ post_date = models.DateTimeField(default=datetime.datetime.now)
+
+class Material(models.Model):
+ post = models.ForeignKey(Post, related_name='materials')
diff --git a/tests/regressiontests/queryset_pickle/tests.py b/tests/regressiontests/queryset_pickle/tests.py
index ab32e8f647..19519b2db9 100644
--- a/tests/regressiontests/queryset_pickle/tests.py
+++ b/tests/regressiontests/queryset_pickle/tests.py
@@ -5,7 +5,8 @@ import datetime
from django.test import TestCase
-from .models import Group, Event, Happening
+from .models import Group, Event, Happening, Person, Post
+from django.contrib.auth.models import AnonymousUser
class PickleabilityTestCase(TestCase):
@@ -46,3 +47,29 @@ class PickleabilityTestCase(TestCase):
# can't just use assertEqual(original, unpickled)
self.assertEqual(original.__class__, unpickled.__class__)
self.assertEqual(original.args, unpickled.args)
+
+ def test_pickle_m2m_prefetch_related(self):
+ bob = Person(name="Bob")
+ bob.save()
+ people = Person.objects.prefetch_related('socialprofile_set')
+ dumped = pickle.dumps(people)
+ people = pickle.loads(dumped)
+ self.assertQuerysetEqual(
+ people, [bob], lambda x: x)
+
+ def test_pickle_field_default_prefetch_related(self):
+ p1 = Post.objects.create()
+ posts = Post.objects.prefetch_related('materials')
+ dumped = pickle.dumps(posts)
+ posts = pickle.loads(dumped)
+ self.assertQuerysetEqual(
+ posts, [p1], lambda x: x)
+
+ def test_pickle_emptyqs(self):
+ u = AnonymousUser()
+ # Use AnonymousUser, as AnonymousUser.groups has qs.model = None
+ empty = u.groups.all()
+ dumped = pickle.dumps(empty)
+ empty = pickle.loads(dumped)
+ self.assertQuerysetEqual(
+ empty, [])