Opened 7 years ago

Closed 7 years ago

Last modified 7 years ago

#7791 closed (fixed)

len() on queryset with distinct ordered by child's field crashes

Reported by: isagalaev Owned by: mtredinnick
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 7 years ago by isagalaev

  • 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 7 years ago by mtredinnick

  • Triage Stage changed from Unreviewed to Accepted

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

comment:3 Changed 7 years ago by isagalaev

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

  • Cc korpios@… added

comment:5 Changed 7 years ago by mtredinnick

  • Resolution set to fixed
  • Status changed from new to closed

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

comment:6 Changed 7 years ago by isagalaev

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

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