﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
15648	Allow QuerySet.values_list() to return a namedtuple	Paul Miller	Sergey Fedoseev	"Python 2.6 supports named tuples. Information about field names is stored in the tuple class, so there's no overhead like in dictionaries.
I propose to use them in querysets instead of values() / values_list().

{{{#!python
qs = Items.objects.filter(...).namedtuples('title', 'amount', 'price')
for item in qs:
    print item.title, item.amount
    total += item.amount * item.price
}}}

Patch:

{{{#!python
from itertools import imap
from collections import namedtuple

# python 2.5 doesn't support named tuples, so we can use this http://code.activestate.com/recipes/500261/

from django.db.models.query import ValuesQuerySet

class NamedTuplesQuerySet(ValuesQuerySet):
    def iterator(self):
        # get field names 
        extra_names = self.query.extra_select.keys()
        field_names = self.field_names
        aggregate_names = self.query.aggregate_select.keys()
        names = extra_names + field_names + aggregate_names
       
        # create named tuple class
        tuple_cls = namedtuple('%sTuple' % self.model.__name__, names)

        results_iter = self.query.get_compiler(self.db).results_iter()
        # wrap every string with our named tuple
        return imap(tuple_cls._make, results_iter)
}}}

{{{#!python
from django.db.models.query import QuerySet

def namedtuples(self, *fields):
    return self._clone(klass=NamedTuplesQuerySet, setup=True, _fields=fields)
QuerySet.namedtuples = namedtuples
}}}"	New feature	closed	Database layer (models, ORM)	dev	Normal	fixed	namedtuple, tuple, queryset	kmike84@… cg@… dougal85@… ShawnMilo paulmillr@…	Accepted	1	0	0	0	0	0
