#7791 closed (fixed)
len() on queryset with distinct ordered by child's field crashes
| Reported by: | Ivan Sagalaev | Owned by: | Malcolm Tredinnick |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Keywords: | ||
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Given this model:
class Restaurant(models.Model): title = models.CharField(max_length=50) class Pizza(models.Model): restaurant = models.ForeignKey(Restaurant) title = models.CharField(max_length=50)
and this data (one test record for each model):
[
{
"pk": 1,
"model": "main.restaurant",
"fields": {
"title": "Karlo"
}
},
{
"pk": 1,
"model": "main.pizza",
"fields": {
"title": "Margherita",
"restaurant": 1
}
}
]
calling len() on a queryset with distinct ordered by child's field:
len(Restaurant.objects.order_by('pizza__title').distinct())
gives this traceback:
Traceback (most recent call last):
File "./manage.py", line 13, in <module>
len(Restaurant.objects.order_by('pizza__title').distinct())
File "/home/isagalaev/py/django/db/models/query.py", line 153, in __len__
self._result_cache = list(self.iterator())
File "/home/isagalaev/py/django/db/models/query.py", line 273, in iterator
obj = self.model(*row[index_start:])
File "/home/isagalaev/py/django/db/models/base.py", line 184, in __init__
raise IndexError("Number of args exceeds number of fields")
IndexError: Number of args exceeds number of fields
Change History (7)
comment:1 by , 17 years ago
comment:2 by , 17 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
Ivan, stop breaking my code! Guess we'll have to fix it now that somebody's noticed. :-(
comment:3 by , 17 years ago
Heh :-)
The fun part is that I've later found out that in out code we'd better just order by a column in parent table instead of ordering by child with distinct :-). But still...
comment:4 by , 17 years ago
| Cc: | added |
|---|
comment:5 by , 17 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
comment:6 by , 17 years ago
Malcolm, thanks you! This fix it's so in time (I was in a process of packaging our internal django-snapshot).
I'm also glad that it wasn't some deep fatal error of "it can't work at all like that" kind :-)
comment:7 by , 17 years ago
| Cc: | removed |
|---|
BTW, it's len() that doesn't work. Actual querying for results works fine: