#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: