NDB の StructuredProperty はそれ以上でもそれ以下でもない

2014年10月23日 22:54

StructuredProperty は文字どおり「構造化されたプロパティ」、つまり、単に入れ子の構造を持たせることができるということであり、リレーショナル云々とはまた別の話である。

以下は、公式ドキュメントにあるサンプル(インデントは自分好みに変更)。

class Address(ndb.Model):
    type = ndb.StringProperty()
    street = ndb.StringProperty()
    city = ndb.StringProperty()

class Contact(ndb.Model):
    name = ndb.StringProperty()
    addresses = ndb.StructuredProperty(Address, repeated=True)

guido = Contact(
    name='Guido',
    addresses=[
        Address(type='home', city='Amsterdam'),
        Address(type='work',street='Spear St', city='SF')
    ]
)

guido.put()

そしてこんな一文がある。

Although the Address instances are defined using the same syntax as for model classes, they are not full-fledged entities. They don't have their own keys in the Datastore.

ざっくり訳すとこんな感じか。

Address インスタンスはモデルクラスと同じ構文を使用して定義されているが、一人前(?)の Entityではない。これらはデータストアにおける Key を持っていない。

なるほど。Key を持っていないのだから、そもそもリレーションできるはずがないというわけか。

では NDB でリレーションっぽいことをしたい場合はどうするか? 普通に考えるに、KeyProperty を使うのが正解なんじゃないか、と。