#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 , 16 years ago
comment:2 by , 16 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 , 16 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 , 16 years ago
Cc: | added |
---|
comment:5 by , 16 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:6 by , 16 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 , 16 years ago
Cc: | removed |
---|
BTW, it's len() that doesn't work. Actual querying for results works fine: