我希望以这种方式通过ReferencePropery获取实体。
getattr(model, refrence)
其中model是db.Model
,引用是db.ReferenceProperty
。但是我得到了一个KindError,我可以通过添加以下类型的导入来避免。
from foomodule import ReferedKind
ReferedKind
是getattr
以上我想要获得的实体的类。
但我的问题在于我的情况,因为我想要调用它的函数的性质,model
可以属于我的任何Model类。所以我不知道ReferedKind
会是什么。
如何在不导入所有可能的模型类的情况下调用getattr
并获取被引用的实体?
有没有办法可以提前知道ReferanceProperty
引用的实体的类,以便我可以动态导入它?
有条件的信息
我正在编写一个函数,它将返回一个json可序列化的python dict。因为在某些情况下,db.to_dict()返回的字典不是json可序列化的。所以这个函数事先并不知道它将要用于什么样的模型。
答案 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
我不确定所有的努力是否值得,你会发现导入模型更容易。您最终需要在使用之前导入任何模型。你唯一可能获得的是一个懒惰的导入,可能会节省一些启动时间。