setattrsetattr(some_instance, 'string_type', some_instance.text_type)
を使用すると、string_typeプロパティという名前のインスタンスプロパティが実際にtext_typeプロパティを指すようになります。したがって、2つの名前が1つのプロパティになります
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__)
上記の2つのプロパティのIDに注意してください。
したがって、インスタンスレベルのプロパティ定義を効果的に再バインドすると、この変更されたモデルがフィールドのタイプでデータストアに書き込まれます。
setattrを使用する場合(この不自然な例では理由がわかりませんが)setattr(some_instance.string_type,TestModel.string_type.get_value_for_datastore(some_instance)
)
、インスタンスプロパティを再バインドするのではなく、割り当てられる値を取得するために最初にを使用してプロパティから値を取得する必要があります。