通过使用 setattr setattr(some_instance, 'string_type', some_instance.text_type)
,您实际上已经使名为 string_type 属性的实例属性实际上指向 text_type 属性。所以两个名字一个属性
The db, ndb, users, urlfetch, and memcache modules are imported.
> from google.appengine.ext import db
> class TestModel(db.Model):
... string_type = db.StringProperty(default='', multiline=True)
... text_type = db.TextProperty()
...
>
> some_instance = TestModel()
> some_instance.text_type = 'foobar'
> setattr(some_instance, 'string_type', some_instance.text_type)
> print type(some_instance.string_type)
<class 'google.appengine.api.datastore_types.Text'>
y> repr(some_instance.string_type)
"u'foobar'"
> id(some_instance.string_type)
168217452
> id(some_instance.text_type)
168217452
> some_instance.string_type.__class__
<class 'google.appengine.api.datastore_types.Text'>
> some_instance.text_type.__class__
<class 'google.appengine.api.datastore_types.Text'>
> dir(some_instance.text_type.__class__)
注意上面两个属性的id。
因此,您有效地重新绑定了实例级属性定义,然后将此修改后的模型与字段的类型一起写入数据存储区。
如果你想使用 setattr (虽然在这个人为的例子中看不到为什么)你应该首先从属性setattr(some_instance.string_type,TestModel.string_type.get_value_for_datastore(some_instance)
)
中获取值来获取要分配的值,而不是重新绑定实例属性。