Opened 9 years ago
Last modified 9 years ago
#26092 closed Bug
Regression when using order_by() on a ManyToManyField using the 'through' feature — at Version 3
Reported by: | Wenzel Jakob | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.9 |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hi,
I'm seeing a serious regression (AttributeError exception thrown) when using the order_by() feature on a ManyToManyField in combination with the 'through' feature.
This worked perfectly fine in Django 1.8.x, I'm seeing it for the first time now. IMHO it is a release blocker, but then the release is already out (so I set the severity as 'Normal').
See below for a minimal example:
class Person(models.Model): name = models.CharField(max_length=200) class Publication(models.Model): title = models.CharField(max_length=200) authors = models.ManyToManyField(Person, through='Author') class Author(models.Model): person = models.ForeignKey(Person, related_name='author_to_publication') publication = models.ForeignKey(Publication) order_id = models.PositiveSmallIntegerField(default=0) class Meta: ordering = ['order_id']
And here is an example test which causes the problem:
from django.test import TestCase from .models import Person, Publication, Author class Test(TestCase): def test(self): person = Person() person.save() publication = Publication(title='test publication') publication.save() author = Author(person=person, publication=publication, order_id=1) author.save() list(publication.authors.order_by('author_to_publication')) Traceback (most recent call last): File "<console>", line 1, in <module> File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/query.py", line 234, in __repr__ data = list(self[:REPR_OUTPUT_SIZE + 1]) File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/query.py", line 258, in __iter__ self._fetch_all() File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/query.py", line 1074, in _fetch_all self._result_cache = list(self.iterator()) File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/query.py", line 52, in __iter__ results = compiler.execute_sql() File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 837, in execute_sql sql, params = self.as_sql() File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 382, in as_sql extra_select, order_by, group_by = self.pre_sql_setup() File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 49, in pre_sql_setup order_by = self.get_order_by() File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 295, in get_order_by field, self.query.get_meta(), default_order=asc)) File "/Users/wenzel/mysite/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 571, in find_ordering_name if field.is_relation and path and opts.ordering and name != field.attname: AttributeError: 'ManyToOneRel' object has no attribute 'attname'
Change History (3)
comment:1 by , 9 years ago
comment:2 by , 9 years ago
Hi --
unfortunately I don't have the cycles to dig deeper at the moment (I already gave up and switched back to Django 1.8.x).
My hope was that this would be easy for somebody from Django project to track down given a tiny self-contained example (which I submitted, see above).
Best, Wenzel
comment:3 by , 9 years ago
Description: | modified (diff) |
---|---|
Severity: | Normal → Release blocker |
Triage Stage: | Unreviewed → Accepted |
Bisected to d43aa28f67c52bc6f5ea5868c711df263895713f
Could you convert the steps to reproduce into a test case for Django's test suite (
tests/m2m_through
orm2m_through_regress
, probably, and reusing existing models, if possible) and bisect to find the commit that caused the breakage?