繁体   English   中英

通过getattr获取数据存储对象而不知道其类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM