[1.9.x] Fixed #26092 -- Fixed QuerySet.order_by() regression with an M2M through model.

Backport of ee596888e1 from master
This commit is contained in:
Anssi Kääriäinen 2016-01-20 11:05:48 +02:00 committed by Tim Graham
parent 076d459110
commit 05e8fa83c3
4 changed files with 19 additions and 1 deletions

View File

@ -568,7 +568,7 @@ class SQLCompiler(object):
# If we get to this point and the field is a relation to another model,
# append the default ordering for that model unless the attribute name
# of the field is specified.
if field.is_relation and path and opts.ordering and name != field.attname:
if field.is_relation and opts.ordering and getattr(field, 'attname', None) != name:
# Firstly, avoid infinite loops.
if not already_seen:
already_seen = set()

View File

@ -41,3 +41,6 @@ Bugfixes
* Fixed CSRF cookie check on POST requests when ``USE_X_FORWARDED_PORT=True``
(:ticket:`26094`).
* Fixed a ``QuerySet.order_by()`` crash when ordering by a relational field of
a ``ManyToManyField`` ``through`` model (:ticket:`26092`).

View File

@ -65,6 +65,7 @@ class CustomMembership(models.Model):
class Meta:
db_table = "test_table"
ordering = ["date_joined"]
class TestNoDefaultsOrNulls(models.Model):

View File

@ -197,6 +197,20 @@ class M2mThroughTests(TestCase):
attrgetter("name")
)
def test_order_by_relational_field_through_model(self):
CustomMembership.objects.create(person=self.jim, group=self.rock)
CustomMembership.objects.create(person=self.bob, group=self.rock)
CustomMembership.objects.create(person=self.jane, group=self.roll)
CustomMembership.objects.create(person=self.jim, group=self.roll)
self.assertQuerysetEqual(
self.rock.custom_members.order_by('custom_person_related_name'),
[self.jim, self.bob], lambda x: x
)
self.assertQuerysetEqual(
self.roll.custom_members.order_by('custom_person_related_name'),
[self.jane, self.jim], lambda x: x
)
def test_query_first_model_by_intermediate_model_attribute(self):
Membership.objects.create(
person=self.jane, group=self.roll,