是否可以通过对象的字典更新Google App Engine数据存储区中的条目?

时间:2009-08-09 19:51:03

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

我尝试了以下代码但它无效:

class SourceUpdate(webapp.RequestHandler):
  def post(self):
    id = int(self.request.get('id'))
    source = Source.get_by_id(id)
    for property in self.request.arguments():
      if property != 'id':
        source.__dict__[property] = self.request.get(property)
    source.put()
    self.redirect('/source')

我发布了所有必需的属性,但条目未更新,并且未显示错误。如何解决?

顺便说一句

class Source(db.Model):
  #some string properties

2 个答案:

答案 0 :(得分:2)

您正在绕过模型'元类(__setattr__)通常用于正确处理属性设置的type(type(source))类功能。将内循环更改为:

for property in self.request.arguments():
  if property != 'id':
    setattr(source, property, self.request.get(property))

并且一切都应该有效(如果可以从字符串中正确设置所有类型的属性,因为这是您从request.get获得的内容)。

答案 1 :(得分:2)

您可能希望研究使用Django表单,而不是直接从请求中设置模型值。它们与App Engine捆绑在一起,便于验证表单数据并将其存储在数据存储区中,以及生成表单HTML。有一篇关于如何将它们与App Engine数据存储区here一起使用的文章。

另外,不要忘记基于GET请求进行更改几乎总是一个坏主意,并导致XSRF漏洞和其他问题!