[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:
parent
076d459110
commit
05e8fa83c3
|
@ -568,7 +568,7 @@ class SQLCompiler(object):
|
||||||
# If we get to this point and the field is a relation to another model,
|
# 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
|
# append the default ordering for that model unless the attribute name
|
||||||
# of the field is specified.
|
# 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.
|
# Firstly, avoid infinite loops.
|
||||||
if not already_seen:
|
if not already_seen:
|
||||||
already_seen = set()
|
already_seen = set()
|
||||||
|
|
|
@ -41,3 +41,6 @@ Bugfixes
|
||||||
|
|
||||||
* Fixed CSRF cookie check on POST requests when ``USE_X_FORWARDED_PORT=True``
|
* Fixed CSRF cookie check on POST requests when ``USE_X_FORWARDED_PORT=True``
|
||||||
(:ticket:`26094`).
|
(:ticket:`26094`).
|
||||||
|
|
||||||
|
* Fixed a ``QuerySet.order_by()`` crash when ordering by a relational field of
|
||||||
|
a ``ManyToManyField`` ``through`` model (:ticket:`26092`).
|
||||||
|
|
|
@ -65,6 +65,7 @@ class CustomMembership(models.Model):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = "test_table"
|
db_table = "test_table"
|
||||||
|
ordering = ["date_joined"]
|
||||||
|
|
||||||
|
|
||||||
class TestNoDefaultsOrNulls(models.Model):
|
class TestNoDefaultsOrNulls(models.Model):
|
||||||
|
|
|
@ -197,6 +197,20 @@ class M2mThroughTests(TestCase):
|
||||||
attrgetter("name")
|
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):
|
def test_query_first_model_by_intermediate_model_attribute(self):
|
||||||
Membership.objects.create(
|
Membership.objects.create(
|
||||||
person=self.jane, group=self.roll,
|
person=self.jane, group=self.roll,
|
||||||
|
|
Loading…
Reference in New Issue