我在Google App Engine中有一个实体,如下所示:
class HesapKalemi(ndb.Model):
hk=ndb.IntegerProperty(indexed=True)
ha=ndb.StringProperty(indexed=True)
A=ndb.FloatProperty(default=0.00)
B=ndb.FloatProperty(default=0.00)
C=ndb.FloatProperty(default=0.00)
F=ndb.FloatProperty(default=0.00)
G=ndb.FloatProperty(default=0.00)
H=ndb.FloatProperty(default=0.00)
I=ndb.FloatProperty(default=0.00)
J=ndb.FloatProperty(default=0.00)
DG=ndb.FloatProperty(default=0.00)
众所周知,普通查询可以在下面:
sektorkodu=self.request.get('sektorkodu')
qall=HesapKalemi.query().order(HesapKalemi.hk)
for hesap in qall:
hesap.ho=hesap.A
有没有办法以这种方式提取A列:
hesap.GETTHECOLUMN('A') or
hesap.GETTHECOLUMN(sektorkodu)
我有一个非常水平的表,想要通过.GETTHECOLUMN(' string')方法在没有if-else结构的情况下查询它。
有这种方法吗?
答案 0 :(得分:3)
在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:在重新阅读问题和评论后,我认为你的问题,或者至少是其中的一部分,可能是如何使用字符串从模型本身获取属性,而不是如何将一列从数据存储区。要回答这个问题,请使用getattr(hesap, "property_name")
或者,这可能更适合您的需求,将hesap转换为hesap_dict = hesap.to_dict()
的词典。然后你可以这样做:
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模板,然后我认为您可以在评论中完成您的要求。