使用实例和model属性检索NDB实体属性值

时间:2012-11-21 08:06:20

标签: google-app-engine google-cloud-datastore

我有许多不同的模型(ModelA,ModelB),其中包含一个引用公共模型(ModelC)实体的KeyProperty。我有一个方法需要使用由ModelA和ModelB的多个实例引用的实体进行一些处理,但每个模型的KeyProperty的命名方式不同,应该是它们在ModelA和ModelB中提供根本不同的角色。我需要使用KeyProperty引用ModelC的处理是ModelA和ModelB的相同实体列表,所以我应该能够定义一个可以在两者上调用的公共方法,但是如何告诉这个方法使用哪个属性?

我可以使用Model的property属性从实体中检索该属性的值吗?

我已经广泛浏览了NDB上的App Engine文档,但我无法弄清楚如何做到这一点。要么是非常微不足道,要么我错过了文档中的内容,但我无法解决这个问题。

我将在下面提供一个简单的例子:

型号:

class ModelA(ndb.Model):
    name = ndb.StringProperty()
    last_model_c = ndb.KeyProperty(kind='ModelC')
    ...

class ModelB(ndb.Model):
    sku = ndb.StringProperty()
    first_use_model_c = ndb.KeyProperty(kind='ModelC')
    ...

class ModelC(ndb.Model):
    ...

致电处理:

...
    q = ModelA.query()
    ...
    self.model_c_scan(q.fetch(), ModelA.last_model_c)

...

    q = ModelB.query()
    ...
    self.model_c_scan(q.fetch(), ModelB.first_use_model_c)

处理:

...
    def model_c_scan(entity_list, property)
        ...
        for entity in entity_list:
            model_c_key = <get the entity's value for the property>
            model_c = model_c_key.get()
            ...

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是使用字符串指定Property的名称,只需使用python的getattr()

兼容ndb模型的纯python方法getattr()的工作原理如下:

getattr(ModelName,'propertyName')