如何在GAE数据存储中创建运行时确定的类型的实体?

2024-04-25 09:14:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个URL路由,它捕获将为其创建实体的模型的名称(例如'/New<model>/')。现在,我将模型名称作为一个字符串。如何获取该字符串并使用它创建此模型的新实体以放入数据存储?你知道吗

我正在为GAE构建一个定制的管理接口,它能够注册新的模型,并基于注册的模型动态构建表单。我需要一种方法,然后能够采取由管理员用户提交的发布数据,并将其放入数据存储使用正确的模型,这将在该表单发布到的网址。我目前正在构建一个处理程序来处理进入该URL方案的请求,但遇到了这个障碍。非常感谢您的帮助。你知道吗


Tags: 数据方法字符串用户模型实体名称url
2条回答

尽管您可以使用

globals()[modelname]

如果模型类是在模块级别定义的,正如@TimHoffman在评论中指出的那样,允许(潜在的恶意)用户任意访问您的globals通常不是一个好主意。你知道吗

由于您是动态生成模型类,因此更安全的方法是将这些模型类保存在dict中:

model = { 'MyModel': MyModelClass, ... }

然后给定字符串名modelname,您可以使用

model[modelname]

我没有用globals来获取我的类构造函数。相反,我创建了一个指向当前模块的变量,并使用getattr捕获类构造函数。这是我的处理人,以防其他人想看看我做了什么。你知道吗

class NewThingHandler(BaseRequestHandler):
    def get(self, thing):
        self.redirect('/admin/')
    def post(self, thing):
        this_module = sys.modules[__name__]
        ThisModel = getattr(this_module, thing)
        arguments = {}
        for property in ThisModel.properties().keys():
            if type(ThisModel._properties[property]) is db.DateProperty:
                this_date = map(int, self.request.get(property).split('/'))
                this_date = datetime.date(this_date[2], this_date[0], this_date[1])
                arguments[property] = this_date
                continue
            arguments[property] = self.request.get(property)

        new_thing = ThisModel(**arguments)
        new_thing.put()
        self.redirect('/admin/')

thing从URL捕获。你知道吗

相关问题 更多 >

    热门问题