在 NDB 世界中,这称为Projection, or a Projection Query。在该文档的链接中,您将看到以下内容:
投影查询类似于以下形式的 SQL 查询:
SELECT name, email, phone FROM CUSTOMER
因此,您所追求的 .GETTHECOLUMN('A') 方法看起来像以下任何一种:
qall_option_one = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=['A'])
qall_option_two = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=[HasepKalemi.A])
# to access the values
for hesap in qall_option_one:
print hesap
# output:
# HesapKalemi(key=Key('HesapKalemi', 1234567890), A=0.00, _projection=('A',))
# HesapKalemi(key=Key('HesapKalemi', 1234567891), A=0.00, _projection=('A',))
# ...
这比获取具有所有属性的完整实体要快一些,但之后您仍然需要遍历它们,即使您只想生成“A”值的列表。您应该查看的另一个选项是"Calling a Function For Each Entity (Mapping)",您可以在其中定义一个回调函数,以便在查询运行时在每个实体上调用。因此,假设您只想要一个“A”值列表。您可以像这样形成该列表:
def callback(hesap):
return hesap.A
a_values = HesapKelami.query().map(callback)
# a_values = [0.00, 0.00, ...]
如果您真的追求性能,请查看asynchronous gets。
注意:您可以使用 GQL 代替投影,但这看起来比使用带有常规 ndb 查询语法 IMO 的投影更混乱/更令人困惑。
编辑:要在评论中回答您的问题,您可以使用投影或映射从多个属性中选择数据。
多个属性的投影:
qall_option_one = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=['A', 'B', 'C'])
qall_option_two = HesapKalemi.query().order(HesapKalemi.hk).fetch(projection=[HesapKalemi.A, HesapKalemi.B, HesapKalemi.C])
# to access the values
for hesap in qall_option_one:
print hesap
# output:
# HesapKalemi(key=Key('HesapKalemi', 1234567890), A=0.00, B=0.00, C=0.00 _projection=('A', 'B', 'C',))
# HesapKalemi(key=Key('HesapKalemi', 1234567891), A=0.00, B=0.00, C=0.00 _projection=('A', 'B', 'C',))
# ...
映射以返回多个属性:
def callback(hesap):
# this returns a tuple of A,B,C values
return hesap.A, hesap.B, hesap.C
values = HesapKelami.query().map(callback)
# values is a list of tuples
# values = [(0.00, 0.00, 0.00), (0.00, 0.00, 0.00), ...]
编辑#2:重读问题和 cmets 后,我认为您的问题,或至少部分问题,可能是如何使用字符串从模型本身获取属性,而不是如何从模型中提取一列数据存储。要回答这个问题,请使用getattr(hesap, "property_name"),或者,这可能更适合您的需求,使用hesap_dict = hesap.to_dict() 将 hesap 转换为字典。然后你可以这样做:
property_name = 'some_string'
hesap = HesapKelami.query().fetch(1)[0]
hesap_dict = hesap.to_dict()
property_value = hesap_dict.get(property_name, None)
您可以将hesap_dict 传递给您的 Jinja2 模板,然后我认为您可以完成您在 cmets 中询问的内容。