Python Django原始SQL查询-如何通过列(而不是元组索引)从SELECT查询中提取值

Python Django原始SQL查询-如何通过列(而不是元组索引)从SELECT查询中提取值,python,django,postgresql,Python,Django,Postgresql,我正在Django(1.11)中使用PostgreSQL数据源执行fetchall()原始SQL查询。结果返回一个元组 我担心的是,我似乎只能通过元组索引获取行的字段,即行[2](或者在模板中,我会执行{{row.2})。但我希望能够使用实际字段名而不是索引,即行.itemno(或者在模板中,我将使用{{row.itemno}}) 我试着使用row.first\u name,但它说“list”对象没有属性“itemno” 是否可以在这个结果中使用字段名 下面是python shell中的一个示例

我正在Django(1.11)中使用
PostgreSQL
数据源执行
fetchall()
原始SQL查询。结果返回一个
元组

我担心的是,我似乎只能通过元组索引获取行的字段,即
行[2]
(或者在模板中,我会执行
{{row.2}
)。但我希望能够使用实际字段名而不是索引,即
行.itemno
(或者在模板中,我将使用
{{row.itemno}}

我试着使用row.first\u name,但它说“list”对象没有属性“itemno”

是否可以在这个结果中使用字段名

下面是python shell中的一个示例:


另外,你可能想知道为什么我还在使用Django 1.11。。。这是因为我们使用的是DjangoCMS,不幸的是,它最多只支持1.11…

django文档解释了如何使用它。从文档中:

默认情况下,Python DB API将返回不带字段名的结果,这意味着您将得到一个值列表,而不是一个dict。在性能和内存成本较低的情况下,您可以使用如下方式将结果作为dict返回:

或者你也可以把你的名字命名为双倍

from collections import namedtuple

def namedtuplefetchall(cursor):
    "Return all rows from a cursor as a namedtuple"
    desc = cursor.description
    nt_result = namedtuple('Result', [col[0] for col in desc])
    return [nt_result(*row) for row in cursor.fetchall()]

我考虑了使用
namedtuple
的建议

到目前为止,它给了我想要的东西;我现在可以在模板中执行类似于
{{row.field}
的操作

但我想我需要确保我的过程不会太复杂和烦人。如果我的代码已经很理想或者不理想,那么下面的代码的评估可能会更有用一些


您可以创建一个命名的耦合来获得您想要的。
from collections import namedtuple

def namedtuplefetchall(cursor):
    "Return all rows from a cursor as a namedtuple"
    desc = cursor.description
    nt_result = namedtuple('Result', [col[0] for col in desc])
    return [nt_result(*row) for row in cursor.fetchall()]