0

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

我可以使用模型的 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()
            ...
4

1 回答 1

0

我找到的解决方案是使用字符串指定属性的名称,并简单地使用 python 的getattr().

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

getattr(ModelName,'propertyName')
于 2012-11-21T23:20:43.187 回答