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