Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 使用实例和模型属性检索NDB实体属性值_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 使用实例和模型属性检索NDB实体属性值

Google app engine 使用实例和模型属性检索NDB实体属性值,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我有许多不同的模型(ModelA、ModelB),其中包括引用公共模型(ModelC)实体的KeyProperty。我有一个方法,需要使用ModelA和ModelB的多个实例所引用的实体进行一些处理,但是每个模型的KeyProperty的命名不同,因为它们在ModelA和ModelB中的角色根本不同。使用引用ModelC的KeyProperty所需的处理是ModelA和ModelB的相同实体列表,因此我应该能够定义一个可以在两者上调用的通用方法,但如何告诉此方法使用哪个属性 我可以使用模型的pr

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

我可以使用模型的property属性从实体检索该属性的值吗

我已经在NDB上详细查看了应用程序引擎文档,但我不知道如何做到这一点。要么它非常琐碎,要么我在文档中遗漏了一些东西,但我就是无法解决这个问题

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

型号:

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()
            ...
呼叫处理:

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()
            ...
处理:

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()
            ...
。。。
def型号c_扫描(实体列表、属性)
...
对于实体列表中的实体:

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

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

getattr(ModelName,'propertyName')

要缩短此过程,您需要检索作为键存储在
ModelA
实体或
ModelB
实体中的每个
ModelC
实体,其中ModelA或ModelB中引用ModelC的属性是一个变量。