如何过滤字典以匹配我的 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 功能可以做到这一点
我有一些简单的模型:
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 功能可以做到这一点