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

时间:2013-07-01 08:08:38

标签: python google-app-engine referenceproperty

我希望以这种方式通过ReferencePropery获取实体。

getattr(model, refrence)

其中model是db.Model,引用是db.ReferenceProperty。但是我得到了一个KindError,我可以通过添加以下类型的导入来避免。

from foomodule import ReferedKind

ReferedKindgetattr以上我想要获得的实体的类。

但我的问题在于我的情况,因为我想要调用它的函数的性质,model可以属于我的任何Model类。所以我不知道ReferedKind会是什么。

如何在不导入所有可能的模型类的情况下调用getattr并获取被引用的实体?

有没有办法可以提前知道ReferanceProperty引用的实体的类,以便我可以动态导入它?

有条件的信息

我正在编写一个函数,它将返回一个json可序列化的python dict。因为在某些情况下,db.to_dict()返回的字典不是json可序列化的。所以这个函数事先并不知道它将要用于什么样的模型。

1 个答案:

答案 0 :(得分:1)

通常,您需要在执行任何操作之前导入所有可能检索的潜在模型。

你为自己制造困难。

执行此操作的唯一方法是在比db.Model或ndb.Model更低的级别工作以获取原始数据然后检查它然后在取消引用referenceproperty或获取键之前仍需要导入模型

如果您决定这样做,ndm将更容易,因为它没有引用属性,但是KeyProperty,您可以使用getattr,检查您是否有密钥,然后获取被称为密钥的对象。 / p>

如果你想坚持使用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

我不确定所有的努力是否值得,你会发现导入模型更容易。您最终需要在使用之前导入任何模型。你唯一可能获得的是一个懒惰的导入,可能会节省一些启动时间。