Opened 6 years ago
Closed 6 years ago
#30456 closed Bug (invalid)
Doing a select_related() after a union() results in an IndexError.
Reported by: | Alex | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Example code
from django.db import models # Create your models here. class City(models.Model): # ... pass class Person(models.Model): # ... hometown = models.ForeignKey( City, on_delete=models.SET_NULL, blank=True, null=True, ) class Book(models.Model): # ... author = models.ForeignKey(Person, on_delete=models.CASCADE)
Person.objects.all().union(Person.objects.all()).select_related('hometown')
Traceback:
Traceback (most recent call last): File "<console>", line 1, in <module> File "/lib/python3.6/site-packages/django/db/models/query.py", line 226, in __repr__ data = list(self[:REPR_OUTPUT_SIZE + 1]) File "/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__ self._fetch_all() File "/lib/python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all self._result_cache = list(self._iterable_class(self)) File "/lib/python3.6/site-packages/django/db/models/query.py", line 66, in __iter__ rel_populator.populate(row, obj) File "/lib/python3.6/site-packages/django/db/models/query.py", line 1748, in populate if obj_data[self.pk_idx] is None: IndexError: tuple index out of range
Also, on a different project with some more complicated models in the same Django version the IndexError occurs earlier, I don't know why.
Traceback (most recent call last): File "lib/python3.6/site-packages/IPython/core/formatters.py", line 224, in catch_format_error r = method(self, *args, **kwargs) File "lib/python3.6/site-packages/IPython/core/formatters.py", line 702, in __call__ printer.pretty(obj) File "lib/python3.6/site-packages/IPython/lib/pretty.py", line 402, in pretty return _repr_pprint(obj, self, cycle) File "lib/python3.6/site-packages/IPython/lib/pretty.py", line 697, in _repr_pprint output = repr(obj) File "lib/python3.6/site-packages/django/db/models/query.py", line 226, in __repr__ data = list(self[:REPR_OUTPUT_SIZE + 1]) File "lib/python3.6/site-packages/django/db/models/query.py", line 250, in __iter__ self._fetch_all() File "lib/python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all self._result_cache = list(self._iterable_class(self)) File "lib/python3.6/site-packages/django/db/models/query.py", line 62, in __iter__ for row in compiler.results_iter(results): File "lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 847, in results_iter row = self.apply_converters(row, converters) File "lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 830, in apply_converters value = row[pos] IndexError: list index out of range
Also reproduced it in 1.11
Change History (1)
comment:1 by , 6 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Summary: | Doing a select_related() after a union() results in an IndexError → Doing a select_related() after a union() results in an IndexError. |
Version: | 2.2 → master |
Note:
See TracTickets
for help on using tickets.
It's unsupported but doesn't raise an error yet. As per the documentation, "only LIMIT, OFFSET, COUNT(*), ORDER BY, and specifying columns (i.e. slicing, count(), order_by(), and values()/values_list()) are allowed on the resulting QuerySet.". See #27995 for a ticket to raise a helpful message about this.