[英]Get a datastore object by getattr without knowing its class
我想以这种方式通过ReferencePropery获取实体。
getattr(model, refrence)
其中model是db.Model
,引用是db.ReferenceProperty
。 但是我得到了KindError,可以通过添加以下种类的导入来避免。
from foomodule import ReferedKind
其中ReferedKind
是我要在getattr
之上获取的实体的类。
但是我的问题是由于要调用此函数的性质, model
可以属于我的任何Model类。 所以我不知道ReferedKind
是什么。
如何调用getattr
并获取引用的实体,而无需导入每个可能的模型类?
有没有一种方法可以提前知道ReferanceProperty
引用的实体的类,以便可以动态导入它?
附加信息
我正在编写一个将返回json可序列化的python字典的函数。 因为在某些情况下db.to_dict()返回的字典无法json序列化。 因此,该函数事先不知道将要放入字典的哪种模型。
通常,您需要导入所有可以检索的潜在模型,然后再执行任何操作。
你让自己变得困难。
唯一的方法是在比db.Model或ndb.Model更低的级别上工作以获取原始数据,然后对其进行检查,然后在取消引用属性或获取键之前,仍需要导入模型。
如果决定执行此操作,则ndm会更容易,因为它没有引用属性,但是没有KeyProperty,则可以使用getattr,检查是否有键,然后获取称为键的对象。
如果您想坚持使用db。 这会很麻烦,因为您需要使用get_value_for_datastore
其中涉及
获取实体的类,获取类的属性,然后调用传入实例的get_value_for_datastore,然后假设已导入,则可以获取密钥。
因此,如果您有一个名为foo的数据存储区实例,
prop = getattr(foo.__class__,"the_property_name")
obj_key = prop.get_value_for_datastore(foo)
然后,您将需要从键中获取种类,然后弄清楚如何为该类型导入模型,然后再获取()键,否则,您仍将获得KindError
我不确定所有的努力是否值得,您会发现导入模型更加容易。 您最终需要在使用任何模型之前将其导入。 您可能唯一获得的是惰性导入,可能节省一些启动时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.