mirror of
https://github.com/django/django.git
synced 2025-11-02 12:58:56 +00:00
Fixed an isnull=False filtering edge-case. Fixes #15316.
The bulk of this patch is due to some fine analysis from Aleksandra Sendecka. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16656 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c3a0dcf6e9
commit
2e56066a5b
4 changed files with 168 additions and 8 deletions
|
|
@ -317,3 +317,29 @@ class ObjectC(models.Model):
|
|||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class SimpleCategory(models.Model):
|
||||
name = models.CharField(max_length=10)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class SpecialCategory(SimpleCategory):
|
||||
special_name = models.CharField(max_length=10)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name + " " + self.special_name
|
||||
|
||||
class CategoryItem(models.Model):
|
||||
category = models.ForeignKey(SimpleCategory)
|
||||
|
||||
def __unicode__(self):
|
||||
return "category item: " + str(self.category)
|
||||
|
||||
class OneToOneCategory(models.Model):
|
||||
new_name = models.CharField(max_length=10)
|
||||
category = models.OneToOneField(SimpleCategory)
|
||||
|
||||
def __unicode__(self):
|
||||
return "one2one " + self.new_name
|
||||
|
||||
|
|
@ -15,7 +15,7 @@ from models import (Annotation, Article, Author, Celebrity, Child, Cover, Detail
|
|||
DumbCategory, ExtraInfo, Fan, Item, LeafA, LoopX, LoopZ, ManagedModel,
|
||||
Member, NamedCategory, Note, Number, Plaything, PointerA, Ranking, Related,
|
||||
Report, ReservedName, Tag, TvChef, Valid, X, Food, Eaten, Node, ObjectA, ObjectB,
|
||||
ObjectC)
|
||||
ObjectC, CategoryItem, SimpleCategory, SpecialCategory, OneToOneCategory)
|
||||
|
||||
|
||||
class BaseQuerysetTest(TestCase):
|
||||
|
|
@ -1043,11 +1043,135 @@ class Queries4Tests(BaseQuerysetTest):
|
|||
[]
|
||||
)
|
||||
|
||||
def test_ticket15316_filter_false(self):
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
c2 = SpecialCategory.objects.create(name="named category1",
|
||||
special_name="special1")
|
||||
c3 = SpecialCategory.objects.create(name="named category2",
|
||||
special_name="special2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c1)
|
||||
ci2 = CategoryItem.objects.create(category=c2)
|
||||
ci3 = CategoryItem.objects.create(category=c3)
|
||||
|
||||
qs = CategoryItem.objects.filter(category__specialcategory__isnull=False)
|
||||
self.assertEqual(qs.count(), 2)
|
||||
self.assertQuerysetEqual(qs, [ci2.pk, ci3.pk], lambda x: x.pk, False)
|
||||
|
||||
def test_ticket15316_exclude_false(self):
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
c2 = SpecialCategory.objects.create(name="named category1",
|
||||
special_name="special1")
|
||||
c3 = SpecialCategory.objects.create(name="named category2",
|
||||
special_name="special2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c1)
|
||||
ci2 = CategoryItem.objects.create(category=c2)
|
||||
ci3 = CategoryItem.objects.create(category=c3)
|
||||
|
||||
qs = CategoryItem.objects.exclude(category__specialcategory__isnull=False)
|
||||
self.assertEqual(qs.count(), 1)
|
||||
self.assertQuerysetEqual(qs, [ci1.pk], lambda x: x.pk)
|
||||
|
||||
def test_ticket15316_filter_true(self):
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
c2 = SpecialCategory.objects.create(name="named category1",
|
||||
special_name="special1")
|
||||
c3 = SpecialCategory.objects.create(name="named category2",
|
||||
special_name="special2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c1)
|
||||
ci2 = CategoryItem.objects.create(category=c2)
|
||||
ci3 = CategoryItem.objects.create(category=c3)
|
||||
|
||||
qs = CategoryItem.objects.filter(category__specialcategory__isnull=True)
|
||||
self.assertEqual(qs.count(), 1)
|
||||
self.assertQuerysetEqual(qs, [ci1.pk], lambda x: x.pk)
|
||||
|
||||
def test_ticket15316_exclude_true(self):
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
c2 = SpecialCategory.objects.create(name="named category1",
|
||||
special_name="special1")
|
||||
c3 = SpecialCategory.objects.create(name="named category2",
|
||||
special_name="special2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c1)
|
||||
ci2 = CategoryItem.objects.create(category=c2)
|
||||
ci3 = CategoryItem.objects.create(category=c3)
|
||||
|
||||
qs = CategoryItem.objects.exclude(category__specialcategory__isnull=True)
|
||||
self.assertEqual(qs.count(), 2)
|
||||
self.assertQuerysetEqual(qs, [ci2.pk, ci3.pk], lambda x: x.pk, False)
|
||||
|
||||
def test_ticket15316_one2one_filter_false(self):
|
||||
c = SimpleCategory.objects.create(name="cat")
|
||||
c0 = SimpleCategory.objects.create(name="cat0")
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
|
||||
c2 = OneToOneCategory.objects.create(category = c1, new_name="new1")
|
||||
c3 = OneToOneCategory.objects.create(category = c0, new_name="new2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c)
|
||||
ci2 = CategoryItem.objects.create(category=c0)
|
||||
ci3 = CategoryItem.objects.create(category=c1)
|
||||
|
||||
qs = CategoryItem.objects.filter(category__onetoonecategory__isnull=False)
|
||||
self.assertEqual(qs.count(), 2)
|
||||
self.assertQuerysetEqual(qs, [ci2.pk, ci3.pk], lambda x: x.pk, False)
|
||||
|
||||
def test_ticket15316_one2one_exclude_false(self):
|
||||
c = SimpleCategory.objects.create(name="cat")
|
||||
c0 = SimpleCategory.objects.create(name="cat0")
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
|
||||
c2 = OneToOneCategory.objects.create(category = c1, new_name="new1")
|
||||
c3 = OneToOneCategory.objects.create(category = c0, new_name="new2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c)
|
||||
ci2 = CategoryItem.objects.create(category=c0)
|
||||
ci3 = CategoryItem.objects.create(category=c1)
|
||||
|
||||
qs = CategoryItem.objects.exclude(category__onetoonecategory__isnull=False)
|
||||
self.assertEqual(qs.count(), 1)
|
||||
self.assertQuerysetEqual(qs, [ci1.pk], lambda x: x.pk)
|
||||
|
||||
def test_ticket15316_one2one_filter_true(self):
|
||||
c = SimpleCategory.objects.create(name="cat")
|
||||
c0 = SimpleCategory.objects.create(name="cat0")
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
|
||||
c2 = OneToOneCategory.objects.create(category = c1, new_name="new1")
|
||||
c3 = OneToOneCategory.objects.create(category = c0, new_name="new2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c)
|
||||
ci2 = CategoryItem.objects.create(category=c0)
|
||||
ci3 = CategoryItem.objects.create(category=c1)
|
||||
|
||||
qs = CategoryItem.objects.filter(category__onetoonecategory__isnull=True)
|
||||
self.assertEqual(qs.count(), 1)
|
||||
self.assertQuerysetEqual(qs, [ci1.pk], lambda x: x.pk)
|
||||
|
||||
def test_ticket15316_one2one_exclude_true(self):
|
||||
c = SimpleCategory.objects.create(name="cat")
|
||||
c0 = SimpleCategory.objects.create(name="cat0")
|
||||
c1 = SimpleCategory.objects.create(name="category1")
|
||||
|
||||
c2 = OneToOneCategory.objects.create(category = c1, new_name="new1")
|
||||
c3 = OneToOneCategory.objects.create(category = c0, new_name="new2")
|
||||
|
||||
ci1 = CategoryItem.objects.create(category=c)
|
||||
ci2 = CategoryItem.objects.create(category=c0)
|
||||
ci3 = CategoryItem.objects.create(category=c1)
|
||||
|
||||
qs = CategoryItem.objects.exclude(category__onetoonecategory__isnull=True)
|
||||
self.assertEqual(qs.count(), 2)
|
||||
self.assertQuerysetEqual(qs, [ci2.pk, ci3.pk], lambda x: x.pk, False)
|
||||
|
||||
|
||||
class Queries5Tests(TestCase):
|
||||
def setUp(self):
|
||||
# Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the Meta.ordering
|
||||
# will be rank3, rank2, rank1.
|
||||
# Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the
|
||||
# Meta.ordering will be rank3, rank2, rank1.
|
||||
n1 = Note.objects.create(note='n1', misc='foo', id=1)
|
||||
n2 = Note.objects.create(note='n2', misc='bar', id=2)
|
||||
e1 = ExtraInfo.objects.create(info='e1', note=n1)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue