在Google App Engine NDB中逐列选择

时间:2017-08-02 11:20:42

标签: python google-app-engine app-engine-ndb

我在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结构的情况下查询它。

有这种方法吗?

1 个答案:

答案 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模板,然后我认为您可以在评论中完成您的要求。