Kaydet (Commit) ee596888 authored tarafından Anssi Kääriäinen's avatar Anssi Kääriäinen Kaydeden (comit) Tim Graham

Fixed #26092 -- Fixed QuerySet.order_by() regression with an M2M through model.

üst 2d28144c
...@@ -555,7 +555,7 @@ class SQLCompiler(object): ...@@ -555,7 +555,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 ...@@ -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): ...@@ -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):
......
...@@ -198,6 +198,20 @@ class M2mThroughTests(TestCase): ...@@ -198,6 +198,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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment