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

How do I filter a dict to match the attributes of my ndb.Model subclass

我有一些简单的模型:

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

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

我有一个 api 为 RequestHandler 提供 json 字典:

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 方法来做到这一点?

使用列表理解获取模型的属性列表

filter_props = [k for k, v in Model1._properties.iteritems()]

使用字典理解按这些 属性 名称过滤原始字典

new_dict = {k:v for (k, v) in self.request.jsondata.iteritems() if k in filter_props}

使用这个新的字典来填充模型

mymodel1.populate(**new_dict)

这已经差不多干净了,没有特殊的 NDB 功能可以做到这一点