Fix calling create() on a related manager based on PassThroughManager.

This commit is contained in:
Carl Meyer 2013-02-12 14:05:31 -07:00
parent cf2c97b620
commit 579abf8e66
3 changed files with 13 additions and 2 deletions

View file

@ -4,6 +4,9 @@ CHANGES
tip (unreleased)
----------------
- Fix calling ``create()`` on a ``RelatedManager`` that subclasses a dynamic
``PassThroughManager``. Thanks SeiryuZ for the report. Fixes GH-24.
- Add workaround for https://code.djangoproject.com/ticket/16855 in
InheritanceQuerySet to avoid overriding prior calls to
``select_related()``. Thanks ivirabyan.

View file

@ -185,6 +185,9 @@ def create_pass_through_manager_for_queryset_class(base, queryset_cls):
return queryset_cls(self.model, **kwargs)
def __reduce__(self):
# our pickling support breaks for subclasses (e.g. RelatedManager)
if self.__class__ is not _PassThroughManager:
return super(_PassThroughManager, self).__reduce__()
return (
unpickle_pass_through_manager_for_queryset_class,
(base, queryset_cls),

View file

@ -608,14 +608,19 @@ class PassThroughManagerTests(TestCase):
class CreatePassThroughManagerTests(TestCase):
def setUp(self):
self.dude = Dude.objects.create(name='El Duderino')
Spot.objects.create(name='The Crib', owner=self.dude, closed=True,
secure=True)
def test_reverse_manager(self):
Spot.objects.create(
name='The Crib', owner=self.dude, closed=True, secure=True)
self.assertEqual(self.dude.spots_owned.closed().count(), 1)
def test_related_queryset_pickling(self):
Spot.objects.create(
name='The Crib', owner=self.dude, closed=True, secure=True)
qs = self.dude.spots_owned.closed()
pickled_qs = pickle.dumps(qs)
unpickled_qs = pickle.loads(pickled_qs)
self.assertEqual(unpickled_qs.secured().count(), 1)
def test_related_manager_create(self):
self.dude.spots_owned.create(name='The Crib', closed=True, secure=True)