如何动态地确定模型的类在谷歌App Engine的存在吗?
-
09-09-2019 - |
题
我希望能够采取动态创建的字符串,说“鸽子”,并在运行谷歌应用程序引擎是否在这个项目命名为“鸽子”定义的模型类确定。如果“鸽子”是existant模型类的名称,我想然后到达如此限定鸽子类的引用。
另外,我不想使用eval可言,因为在这种情况下,动态字符串“鸽子”,来自外部的。
解决方案
有两个相当简单的方法来做到这一点,而不依赖于内部细节:
使用google.appengine.api.datastore API,像这样:
from google.appengine.api import datastore
q = datastore.Query('EntityType')
if q.get(1):
print "EntityType exists!"
另一种选择是使用db.Expando类:
def GetEntityClass(entity_type):
class Entity(db.Expando):
@classmethod
def kind(cls):
return entity_type
return Entity
cls = GetEntityClass('EntityType')
if cls.all().get():
print "EntityType exists!"
后者的优点是可以使用GetEntityClass生成用于任何实体类型在Expando类,并与它进行交互的相同方式的优点你将一个普通的类。
其他提示
您可以尝试,虽然可能非常,非常糟糕的做法:
def get_class_instance(nm) :
try :
return eval(nm+'()')
except :
return None
此外,为了使更安全的,你可以给一个EVAL当地人哈希:eval(nm+'()', {'Pigeon':pigeon})
我不知道,如果这样做的工作,它肯定有一些问题:如果有一个叫nm
的价值功能,这将返回:
def Pigeon() :
return "Pigeon"
print(get_class_instance('Pigeon')) # >> 'Pigeon'
修改:这样做的另一种方式可能是(未经测试),如果你知道模块:点击 (对不起,我一直忘了这不是obj.hasattr,其hasattr(OBJ)!)的
import models as m
def get_class_instance(nm) :
if hasattr(m, nm) :
return getattr(m, nm)()
else : return None
编辑2 :是的,它的工作!宇!
实际上,通过源代码和interweb来看,我发现,似乎适合的纸币一个无证方法。
from google.appengine.ext import db
key = "ModelObject" #This is a dynamically generated string
klass = db.class_for_kind(key)
此方法将抛出一个描述性的异常,如果该类不存在,所以你应该抓住它,如果密钥字符串来自外部。
不隶属于 StackOverflow