Commit 415ffa8d authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #10028 -- Fixed a problem when ordering by related models.

Some results were inadvertently being excluded if we were ordering across a
nullable relation which itself ordering by a non-nullable relation.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9916 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 4ad77254
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -834,8 +834,9 @@ class BaseQuery(object):
            # the model.
            self.ref_alias(alias)

        # Must use left outer joins for nullable fields.
        self.promote_alias_chain(joins)
        # Must use left outer joins for nullable fields and their relations.
        self.promote_alias_chain(joins,
                self.alias_map[joins[0]][JOIN_TYPE] == self.LOUTER)

        # If we get to this point and the field is a relation to another model,
        # append the default ordering for that model.
+31 −0
Original line number Diff line number Diff line
@@ -238,6 +238,32 @@ class PointerA(models.Model):
class PointerB(models.Model):
    connection = models.ForeignKey(SharedConnection)

# Multi-layer ordering
class SingleObject(models.Model):
    name = models.CharField(max_length=10)

    class Meta:
        ordering = ['name']

    def __unicode__(self):
        return self.name

class RelatedObject(models.Model):
    single = models.ForeignKey(SingleObject)

    class Meta:
        ordering = ['single']

class Plaything(models.Model):
    name = models.CharField(max_length=10)
    others = models.ForeignKey(RelatedObject, null=True)

    class Meta:
        ordering = ['others']

    def __unicode__(self):
        return self.name


__test__ = {'API_TESTS':"""
>>> t1 = Tag.objects.create(name='t1')
@@ -1044,6 +1070,11 @@ Bug #9985 -- qs.values_list(...).values(...) combinations should work.
>>> Annotation.objects.filter(notes__in=Note.objects.filter(note="n1").values_list('note').values('id'))
[<Annotation: a1>]

Bug #10028 -- ordering by model related to nullable relations(!) should use
outer joins, so that all results are included.
>>> _ = Plaything.objects.create(name="p1")
>>> Plaything.objects.all()
[<Plaything: p1>]
"""}

# In Python 2.3 and the Python 2.6 beta releases, exceptions raised in __len__