0

Google エンドポイントを使用して、メッセージから直接別のエンティティへの参照を持つエンティティを自動的に挿入できるようにしたいと考えています。

メッセージで送信するReferencePropertyには、 のエンコードされた文字列値を使用しますKey。メッセージを送信する場合は問題ありませんが、メッセージを受信して​​そのエンティティを作成する場合、エンコードされた文字列をパラメーターとしてコンストラクターに渡すことはできません。

たとえば、BaseModelそれ自体が継承する を継承する 2 つのクラスがあるとします。db.models

class TestModel2(models.BaseModel):
    test_string = db.StringProperty(required=True)

class TestModel(models.BaseModel):
    test2 = db.ReferenceProperty(TestModel2)
    test2_id = property(models.BaseModel._get_attr_id_builder('test2'),
                       models.BaseModel._set_attr_id_builder('test2'))

そしてメッセージクラス

class TestModelMessage(messages.Message):
    test2_id = messages.StringField(4)

Entity TestModelの を直接作成できるようにしたいTestModelMessage

プロパティを使用して、別の方法で(エンティティからメッセージへ)それを行うことができました。db.modelsしかし、他の方法では、のコンストラクターが継承する属性のみを設定すると感じているため、機能しませんdb.Property。したがって、プロパティのセッターは呼び出されません...

どうすればこれを行うことができますか?

__init__inをオーバーライドすることを考えましたが、 of をBaseModel呼び出すと、おそらく.__init__db.modelsReferenceProperty

4

1 に答える 1

0

そこで、クラスに_ref_propertiesフィールドを追加しました。BaseModel前の例では、次のようになります。_ref_properties = {'test2': 'test2_id'}

次に、このクラスメソッドを追加しました

@classmethod
def from_message(cls, message, *args):
    attributes = {attr: getattr(message, attr) for attr in args}
    for attribute, property in cls._ref_properties.items():
        attributes[attribute] = db.Key(encoded=getattr(message, property))
    entity = cls(**attributes)
    return entity

そしてそれはうまくいくようです。おそらく最高ではありません。コメントまたはより良い解決策はありますか?

于 2013-05-11T06:46:38.123 に答える