Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#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: master
Severity: Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

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 Changed 8 years ago by Ivan Sagalaev

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset

BTW, it's len() that doesn't work. Actual querying for results works fine:

list(Restaurant.objects.order_by('pizza__title').distinct())

comment:2 Changed 8 years ago by Malcolm Tredinnick

Triage Stage: UnreviewedAccepted

Ivan, stop breaking my code! Guess we'll have to fix it now that somebody's noticed. :-(

comment:3 Changed 8 years ago by Ivan Sagalaev

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 Changed 8 years ago by korpios

Cc: korpios@… added

comment:5 Changed 8 years ago by Malcolm Tredinnick

Resolution: fixed
Status: newclosed

(In [8052]) Fixed #7791 -- Fixed a really silly error I introduced in [7926]. :-(

comment:6 Changed 8 years ago by Ivan Sagalaev

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 Changed 8 years ago by korpios

Cc: korpios@… removed
Note: See TracTickets for help on using tickets.
Back to Top