Opened 15 years ago

Closed 15 years ago

Last modified 11 years ago

#10064 closed (fixed)

error: annotate doesn't support select_related

Reported by: olivius Owned by:
Component: Database layer (models, ORM) Version: dev
Severity: Keywords: annotate
Cc: flosch@…, elsdoerfer@… Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Alex Gaynor)

models.py:

class Account(models.Model):
    accountname = models.CharField(max_length=20)
    account_creator = models.ForeignKey(User)
    description = models.TextField(_('description'), blank=True)
    
    def __unicode__(self):
        return self.account


class Category(models.Model):
    category_name = models.CharField(max_length=50)
    category_creator = models.ForeignKey(User)
    description = models.TextField(_('description'), blank=True)
    def __unicode__(self):
        return self.category


class Transaction(models.Model):
    category            = models.ForeignKey(Category)
    account_from        = models.ForeignKey(Account, related_name='account_from')
    account_to          = models.ForeignKey(Account, related_name='account_to')
    creator             = models.ForeignKey(User)
    label               = models.CharField(_('label'), max_length=30)
    description         = models.TextField(_('description'), blank=True)
    ammount             = models.DecimalField(_('amount'),max_digits=8, decimal_places=2)
    created_at          = models.DateTimeField(_('created at'), default=datetime.now)
    updated_at          = models.DateTimeField(_('updated at'))
    
    def __unicode__(self):
        return self.label

shell:

>>> transactions=Transaction.objects.select_related('category','account_from','account_to').annotate(Sum('amount')).order_by('category','updated_at')
>>> print transactions
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 239, in __getitem__
    return list(qs)[0]
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 163, in __len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 294, in iterator
    setattr(obj, aggregate, row[i+aggregate_start])
IndexError: tuple index out of range

Change History (10)

comment:1 by olivius <oliver.janssen@…>, 15 years ago

comment:2 by Karen Tracey, 15 years ago

Description: modified (diff)

(Fixed formatting.)

comment:3 by anonymous, 15 years ago

Cc: flosch@… added

comment:4 by Alex Gaynor, 15 years ago

Description: modified (diff)

cleaned up the formatting of the description slightly.

comment:5 by olivius <oliver.janssen@…>, 15 years ago

models.py:

class Account(models.Model):
    accountname = models.CharField(max_length=20)
    account_creator = models.ForeignKey(User)
    description = models.TextField(_('description'), blank=True)
    
    def __unicode__(self):
        return self.account


class Category(models.Model):
    category_name = models.CharField(max_length=50)
    category_creator = models.ForeignKey(User)
    description = models.TextField(_('description'), blank=True)
    def __unicode__(self):
        return self.category


class Transaction(models.Model):
    category            = models.ForeignKey(Category)
    account_from        = models.ForeignKey(Account, related_name='account_from')
    account_to          = models.ForeignKey(Account, related_name='account_to')
    creator             = models.ForeignKey(User)
    label               = models.CharField(_('label'), max_length=30)
    description         = models.TextField(_('description'), blank=True)
    amount              = models.DecimalField(_('amount'),max_digits=8, decimal_places=2)
    created_at          = models.DateTimeField(_('created at'), default=datetime.now)
    updated_at          = models.DateTimeField(_('updated at'))
    
    def __unicode__(self):
        return self.label

shell:

>>> transactions=Transaction.objects.select_related('category','account_from','account_to').annotate(Sum('amount')).order_by('category','updated_at')
>>> print transactions
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 239, in __getitem__
    return list(qs)[0]
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 163, in __len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python25\lib\site-packages\django\db\models\query.py", line 294, in iterator
    setattr(obj, aggregate, row[i+aggregate_start])
IndexError: tuple index out of range

comment:6 by olivius , 15 years ago

Typo: changed 'ammount' to 'amount' in class Transaction

comment:7 by anonymous, 15 years ago

Cc: elsdoerfer@… added

comment:8 by Russell Keith-Magee, 15 years ago

Resolution: fixed
Status: newclosed

(In [9781]) Fixed #10064 -- Corrected handling of aggregate queries that also use select_related(). Thanks to olivius for the report.

comment:9 by (none), 15 years ago

milestone: post-1.0

Milestone post-1.0 deleted

comment:10 by Anssi Kääriäinen, 11 years ago

Component: ORM aggregationDatabase layer (models, ORM)
Note: See TracTickets for help on using tickets.
Back to Top