我有一些简单的模型:
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方式吗?
答案 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功能来执行此操作