Ticket #15316: ticket15316.diff

File ticket15316.diff, 6.2 KB (added by ethlinn, 4 years ago)

patch with more tests

  • AUTHORS

     
    443443    schwank@gmail.com
    444444    scott@staplefish.com
    445445    Ilya Semenov <semenov@inetss.com>
     446    Aleksandra Sendecka <asendecka@hauru.eu>
    446447    serbaut@gmail.com
    447448    John Shaffer <jshaffer2112@gmail.com>
    448449    Pete Shinners <pete@shinners.org>
  • django/db/models/sql/query.py

     
    10751075                    can_reuse)
    10761076            return
    10771077
    1078         if (lookup_type == 'isnull' and value is True and not negate and
     1078        if (lookup_type == 'isnull' and not negate and
    10791079                len(join_list) > 1):
    10801080            # If the comparison is against NULL, we may need to use some left
    10811081            # outer joins when creating the join chain. This is only done when
  • tests/regressiontests/queries/models.py

     
    1212class NamedCategory(DumbCategory):
    1313    name = models.CharField(max_length=10)
    1414
     15class SimpleCategory(models.Model):
     16    name = models.CharField(max_length=10)
     17
     18    def __unicode__(self):
     19        return self.name
     20
     21class SpecialCategory(SimpleCategory):
     22    special_name = models.CharField(max_length=10)
     23
     24    def __unicode__(self):
     25        return self.name + " " + self.special_name
     26
    1527class Tag(models.Model):
    1628    name = models.CharField(max_length=10)
    1729    parent = models.ForeignKey('self', blank=True, null=True,
     
    2436    def __unicode__(self):
    2537        return self.name
    2638
     39class CategoryItem(models.Model):
     40    category = models.ForeignKey(SimpleCategory)
     41
     42    def __unicode__(self):
     43        return "category item: " + str(self.category)
     44
    2745class Note(models.Model):
    2846    note = models.CharField(max_length=100)
    2947    misc = models.CharField(max_length=10)
  • tests/regressiontests/queries/tests.py

     
    1515    DumbCategory, ExtraInfo, Fan, Item, LeafA, LoopX, LoopZ, ManagedModel,
    1616    Member, NamedCategory, Note, Number, Plaything, PointerA, Ranking, Related,
    1717    Report, ReservedName, Tag, TvChef, Valid, X, Food, Eaten, Node, ObjectA, ObjectB,
    18     ObjectC)
     18    ObjectC, CategoryItem, SimpleCategory, SpecialCategory)
    1919
    2020
    2121class BaseQuerysetTest(TestCase):
     
    10321032            []
    10331033        )
    10341034
     1035    def test_ticket15316_filter_false(self):
     1036        c1 = SimpleCategory(name="category1")
     1037        c2 = SpecialCategory(name="named category1", special_name="special1")
     1038        c3 = SpecialCategory(name="named category2", special_name="special2")
     1039        c1.save()
     1040        c2.save()
     1041        c3.save()
    10351042
     1043        ci1 = CategoryItem(category=c1)
     1044        ci2 = CategoryItem(category=c2)
     1045        ci3 = CategoryItem(category=c3)
     1046        ci1.save()
     1047        ci2.save()
     1048        ci3.save()
     1049
     1050        self.assertEqual(
     1051            CategoryItem.objects.filter(category__specialcategory__isnull=False).count(),
     1052            2
     1053        )
     1054
     1055        self.assertItemsEqual(
     1056            CategoryItem.objects.filter(category__specialcategory__isnull=False),
     1057            CategoryItem.objects.filter(pk__in=[ci2.pk, ci3.pk])
     1058        )
     1059
     1060    def test_ticket15316_exclude_false(self):
     1061        c1 = SimpleCategory(name="category1")
     1062        c2 = SpecialCategory(name="named category1", special_name="special1")
     1063        c3 = SpecialCategory(name="named category2", special_name="special2")
     1064        c1.save()
     1065        c2.save()
     1066        c3.save()
     1067
     1068        ci1 = CategoryItem(category=c1)
     1069        ci2 = CategoryItem(category=c2)
     1070        ci3 = CategoryItem(category=c3)
     1071        ci1.save()
     1072        ci2.save()
     1073        ci3.save()
     1074
     1075        self.assertEqual(
     1076            CategoryItem.objects.exclude(category__specialcategory__isnull=False).count(),
     1077            1
     1078        )
     1079
     1080        self.assertItemsEqual(
     1081            CategoryItem.objects.exclude(category__specialcategory__isnull=False),
     1082            CategoryItem.objects.filter(pk__in=[ci1.pk])
     1083        )
     1084
     1085    def test_ticket15316_filter_true(self):
     1086        c1 = SimpleCategory(name="category1")
     1087        c2 = SpecialCategory(name="named category1", special_name="special1")
     1088        c3 = SpecialCategory(name="named category2", special_name="special2")
     1089        c1.save()
     1090        c2.save()
     1091        c3.save()
     1092
     1093        ci1 = CategoryItem(category=c1)
     1094        ci2 = CategoryItem(category=c2)
     1095        ci3 = CategoryItem(category=c3)
     1096        ci1.save()
     1097        ci2.save()
     1098        ci3.save()
     1099
     1100        self.assertEqual(
     1101            CategoryItem.objects.filter(category__specialcategory__isnull=True).count(),
     1102            1
     1103        )
     1104
     1105        self.assertItemsEqual(
     1106            CategoryItem.objects.filter(category__specialcategory__isnull=True),
     1107            CategoryItem.objects.filter(pk__in=[ci1.pk])
     1108        )
     1109
     1110    def test_ticket15316_exclude_true(self):
     1111        c1 = SimpleCategory(name="category1")
     1112        c2 = SpecialCategory(name="named category1", special_name="special1")
     1113        c3 = SpecialCategory(name="named category2", special_name="special2")
     1114        c1.save()
     1115        c2.save()
     1116        c3.save()
     1117
     1118        ci1 = CategoryItem(category=c1)
     1119        ci2 = CategoryItem(category=c2)
     1120        ci3 = CategoryItem(category=c3)
     1121        ci1.save()
     1122        ci2.save()
     1123        ci3.save()
     1124
     1125        self.assertEqual(
     1126            CategoryItem.objects.exclude(category__specialcategory__isnull=True).count(),
     1127            2
     1128        )
     1129
     1130        self.assertItemsEqual(
     1131            CategoryItem.objects.exclude(category__specialcategory__isnull=True),
     1132            CategoryItem.objects.filter(pk__in=[ci2.pk, ci3.pk])
     1133        )
     1134
    10361135class Queries5Tests(TestCase):
    10371136    def setUp(self):
    10381137        # Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the Meta.ordering
Back to Top