diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2013-05-21 11:06:49 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2013-05-21 11:45:24 +0300 |
| commit | bac187c0d8e829fb3ca2ca82965eabbcbcb6ddd5 (patch) | |
| tree | 68c928525813836104b4587cb217c45efec9f735 /tests | |
| parent | 63cab03f6ddd9faa5a770ae08791b2a70aa0a578 (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.py | 13 | ||||
| -rw-r--r-- | tests/regressiontests/queryset_pickle/tests.py | 29 |
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, []) |
