2011-11-25 72 views
0

我需要能够将数据写入Google-app-engine的数据存储区,以用于某些已知实体。但我不想为实体的每个参数写入赋值代码。我meen,我不想做这样的如何通过动态参数名称来写入数据

val_1 = self.request.get('prop_1') 
val_2 = self.request.get('prop_2') 
... 
val_N = self.request.get('prop_N') 
item.prop_1 = val_1 
item.prop_2 = val_2 
... 
item.prop_N = val_N 
item.put() 

相反,我想要做这样的事情

args = self.request.arguments() 
    for prop_name in args: 
    item.set(prop_name, self.request.get(prop_name)) 
item.put() 

剂量任何人知道如何做到这一点把戏?

this question是与我相似,但似乎这家伙想只读取数据。我需要写!

+1

相关:http://stackoverflow.com/questions/746942/adding-a-user-supplied-property -at-runtime-to-an-instance-of-expando-class- –

回答

0

我只是想为this question 斯坦达特蟒蛇函数给出一个建议setattr(item, param, value)正常工作与db.Model的成员

0

您需要使用Expando类。

The Expando class is a superclass for data model definitions whose properties are determined dynamically. An Expando model can have a combination of fixed properties similar to Model and dynamic properties assigned to an entity at run-time

+0

谢谢,但它不适合我的情况。在我的情况下,prop_name是我从* request *对象中获取的字符串,我也没有看到在Expando中使用它的方法。 –

+0

@MaximWelikobratov item.setattr(name,value)应该做的伎俩,但该项目需要是一个expando。 –

+0

看来Expando没有setattr。我找不到这种方法的说明,它说我的快速测试*“AttributeError:'超'对象没有属性'setattr'”* –

0

您可以使用exec这样做,但我不会推荐它。请考虑与此有关的安全影响。例如。用户发布新对象的可能性,从而可能劫持对象。

但是,如果您必须这样做,那么exec方法肯定会对您有所帮助,因为described here(该链接还包含更多的原因,为什么这可能不是一个好主意)。

继续在自己的风险。

+0

这是一个非常糟糕的主意,尤其是因为Python内置了在运行时设置属性和属性的机制。 –

相关问题