Avoid overriding prior calls to select_related in select_subclasses.

This commit is contained in:
Carl Meyer 2013-02-01 22:53:11 -07:00
parent 93a1a44ee7
commit cf2c97b620
3 changed files with 19 additions and 0 deletions

View file

@ -4,6 +4,10 @@ CHANGES
tip (unreleased)
----------------
- Add workaround for https://code.djangoproject.com/ticket/16855 in
InheritanceQuerySet to avoid overriding prior calls to
``select_related()``. Thanks ivirabyan.
- Added support for arbitrary levels of model inheritance in
InheritanceManager. Thanks ivirabyan. (This feature only works in Django
1.6+ due to https://code.djangoproject.com/ticket/16572).

View file

@ -20,7 +20,11 @@ class InheritanceQuerySet(QuerySet):
if django.VERSION < (1, 6, 0):
levels = 1
subclasses = self._get_subclasses_recurse(self.model, levels=levels)
# workaround https://code.djangoproject.com/ticket/16855
field_dict = self.query.select_related
new_qs = self.select_related(*subclasses)
if isinstance(new_qs.query.select_related, dict) and isinstance(field_dict, dict):
new_qs.query.select_related.update(field_dict)
new_qs.subclasses = subclasses
return new_qs

View file

@ -344,6 +344,17 @@ class InheritanceManagerTests(TestCase):
self.child1)
def test_prior_select_related(self):
# Django 1.2 doesn't have assertNumQueries
if django.VERSION >= (1, 3):
with self.assertNumQueries(1):
obj = self.get_manager().select_related(
"inheritancemanagertestchild1").select_subclasses(
"inheritancemanagertestchild2").get(pk=self.child1.pk)
obj.inheritancemanagertestchild1
class InheritanceManagerRelatedTests(InheritanceManagerTests):
def setUp(self):
self.related = InheritanceManagerTestRelated.objects.create()