明确访问SQLAlchemy类字段并修复“对象不可下标”错误

时间:2019-11-23 20:05:23

标签: python flask sqlalchemy jinja2 flask-sqlalchemy

我正在使用SQLAlchemy模型开发我的第一个Flask应用程序,我有大约10个代表数据库表的类,而这些类具有代表列的字段。

现在在我的app.py中,我试图从数据库中选择数据,并使其具有字典列表的形式(一个字典代表一行):

[{'column_name1': 'data1', 'column_name2': 'data2', ...}, {'column_name1': 'data3', 'column_name2': 'data4', ...}, ...]

这是我想出的,但是不起作用:

column_names = table.__table__.columns.keys()  # get columns names
records = table.query.whooshee_search(phrase).all()  # get table records

DATA = []

for record in records:
    row = {}
    for column_name in column_names:
        row[column_name] = record[column_name]
    DATA.append(row)

table之前被分配了一个类,然后column_names是一个字符串列表,这些字符串是在该类中定义的列的名称。 recordstable类对象的列表,它们代表选定的行(包含phrase)。我检查过在html中显示结果,可以正常工作并返回应该返回的内容。

但是,我希望将它们作为动态创建的字典(这样,我不必为每个可能的table值指定列名,而要使用column_names)。第row[column_name] = record[column_name]行似乎是问题所在-我收到了错误

TypeError: 'User' object is not subscriptable

其中User是类之一(table的当前值)。 row[column_name] = record.column_name是我的另一种(愚蠢的)方法,它当然也不起作用。最后要提到的是,{{ record[column_name] }}是我在Jinja2中显示结果时使用的html语法。

1 个答案:

答案 0 :(得分:1)

默认情况下,使用Flask-SQLAlchemy定义的模型不包含__getitem__(self, key)方法,因此您不能执行table["some_key"]

一种方法是在模型定义中显式定义__getitem__(self, key)方法。这是一个可行的示例。

class User:
    def __init__(self):
        self.member = 0

    def __getitem__(self, field):
        return self.__dict__[field]

user = User()
print(user.member) # 0
print(user["member"]) # 0

来源:

  1. https://flask-sqlalchemy.palletsprojects.com/en/2.x/api/?highlight=model#models
  2. https://docs.python.org/3/reference/datamodel.html#object.getitem