如何过滤dict以匹配我的ndb.Model子类的属性

时间:2015-03-31 11:12:20

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我有一些简单的模型:

class MyModel1(ndb.Model):
    attribute1 = ndb.StringProperty()
    attribute2 = ndb.StringProperty()

class MyModel2(MyModel1):
    attribute3 = ndb.StringProperty()
    attribute4 = ndb.StringProperty()

我有一个api,它为一个RequestHandler提供了一个json dict:

class APIRequestHandler(webapp2.RequestHandler):
    def dispatch(self):
        if len(self.request.body) > 0:
            self.request.jsondata = json.loads(self.request.body)
        super(APIRequestHandler, self).dispatch()

我有一些支持PUT的具体子类:

class MyModel1Handler(APIRequestHandler):

    def put(self, key):
        mymodel1 = get_model(key)
        mymodel1.populate(**self.request.jsondata)
        mymodel1.put()
#write the response

class MyModel2Handler(APIRequestHandler):

    def put(self, key):
        mymodel2 = get_model(key)
        mymodel2.populate(**self.request.jsondata)
        mymodel2.put()
#write the response

但是,我想在调用populate删除任何非对象属性的键时过滤dict self.request.jsondata。有一种简单的pythonic方式吗?

1 个答案:

答案 0 :(得分:2)

使用列表推导

获取模型属性的列表
filter_props = [k for k, v in Model1._properties.iteritems()]

使用dict理解

通过这些属性名称过滤原始字典
new_dict = {k:v for (k, v) in self.request.jsondata.iteritems() if k in filter_props}

使用此新dict填充模型

mymodel1.populate(**new_dict)

这很干净,没有特殊的NDB功能来执行此操作