我正在使用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
是一个字符串列表,这些字符串是在该类中定义的列的名称。 records
是table
类对象的列表,它们代表选定的行(包含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
语法。
答案 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
来源: