【问题标题】:Retrieving NDB entity property value with the instance and the model property使用实例和模型属性检索 NDB 实体属性值
【发布时间】:2012-11-21 08:06:20
【问题描述】:

我有许多不同的模型(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()
            ...

【问题讨论】:

  • 为了缩短这个时间,您想检索每个ModelC 实体,它作为键存储在ModelA 实体或ModelB 实体中?
  • ModelA 或 ModelB 中引用 ModelC 的属性是一个变量。

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


【解决方案1】:

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

纯python方法getattr()也兼容ndb模型,如下所示:

getattr(ModelName,'propertyName')

【讨论】:

    猜你喜欢
    • 2015-02-19
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多