Skip to content

Commit

Permalink
Fixed #14423 -- corrected incorrect SQL being generated when a nullab…
Browse files Browse the repository at this point in the history
…le, inherited field was used in an exclude. Thanks to PhiR_42 for the patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14600 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
alex committed Nov 17, 2010
1 parent c0248f6 commit 0eb31d3
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
10 changes: 6 additions & 4 deletions django/db/models/sql/query.py
Expand Up @@ -921,8 +921,7 @@ def add_aggregate(self, aggregate, model, alias, is_summary):
"""
opts = model._meta
field_list = aggregate.lookup.split(LOOKUP_SEP)
if (len(field_list) == 1 and
aggregate.lookup in self.aggregates.keys()):
if len(field_list) == 1 and aggregate.lookup in self.aggregates:
# Aggregate is over an annotation
field_name = field_list[0]
col = field_name
Expand Down Expand Up @@ -1090,11 +1089,14 @@ def add_filter(self, filter_expr, connector=AND, negate=False, trim=False,
if self.alias_map[alias][JOIN_TYPE] == self.LOUTER:
j_col = self.alias_map[alias][RHS_JOIN_COL]
entry = self.where_class()
entry.add((Constraint(alias, j_col, None), 'isnull', True), AND)
entry.add(
(Constraint(alias, j_col, None), 'isnull', True),
AND
)
entry.negate()
self.where.add(entry, AND)
break
elif not (lookup_type == 'in'
if not (lookup_type == 'in'
and not hasattr(value, 'as_sql')
and not hasattr(value, '_as_sql')
and not value) and field.null:
Expand Down
34 changes: 28 additions & 6 deletions tests/regressiontests/model_inheritance_regress/tests.py
Expand Up @@ -3,12 +3,16 @@
"""

import datetime
from operator import attrgetter

from django.test import TestCase
from regressiontests.model_inheritance_regress.models import (
Place, Restaurant, ItalianRestaurant, ParkingLot, ParkingLot2,
ParkingLot3, Supplier, Wholesaler, Child, SelfRefChild, ArticleWithAuthor,
M2MChild, QualityControl, DerivedM, Person, BirthdayParty, BachelorParty,
MessyBachelorParty, InternalCertificationAudit)

from models import (Place, Restaurant, ItalianRestaurant, ParkingLot,
ParkingLot2, ParkingLot3, Supplier, Wholesaler, Child, SelfRefParent,
SelfRefChild, ArticleWithAuthor, M2MChild, QualityControl, DerivedM,
Person, BirthdayParty, BachelorParty, MessyBachelorParty,
InternalCertificationAudit)


class ModelInheritanceTest(TestCase):
def test_model_inheritance(self):
Expand Down Expand Up @@ -355,7 +359,10 @@ def test_abstract_base_class_m2m_relation_inheritance(self):
self.assertEqual(parties, [bachelor, messy_parent])

def test_11369(self):
"""verbose_name_plural correctly inherited from ABC if inheritance chain includes an abstract model."""
"""
verbose_name_plural correctly inherited from ABC if inheritance chain
includes an abstract model.
"""
# Regression test for #11369: verbose_name_plural should be inherited
# from an ABC even when there are one or more intermediate
# abstract models in the inheritance chain, for consistency with
Expand All @@ -364,3 +371,18 @@ def test_11369(self):
InternalCertificationAudit._meta.verbose_name_plural,
u'Audits'
)

def test_inherited_nullable_exclude(self):
obj = SelfRefChild.objects.create(child_data=37, parent_data=42)
self.assertQuerysetEqual(
SelfRefParent.objects.exclude(self_data=72), [
obj.pk
],
attrgetter("pk")
)
self.assertQuerysetEqual(
SelfRefChild.objects.exclude(self_data=72), [
obj.pk
],
attrgetter("pk")
)

0 comments on commit 0eb31d3

Please sign in to comment.