2

私は NDB と MBObject という Expando モデルを使用しています。これは、固定スキームなしで動的にオブジェクトを作成しているためです。辞書からオブジェクトを作成します。

dic = {"groupName" : "my group",
       "members" : [{"memberId" : "1"}, {"memberId" : "2"}]}

だから私がやりたいことは、メンバーと呼ばれるプロパティを持つグループ オブジェクトを作成することです。ここで、メンバーは MBObjects の LocalStructuredProperty です。(すべてのオブジェクトは MBObject の、ndb.Expando のサブクラスです)

ただし、2 番目の部分を動的に指定する方法がないようで、エラーが発生します。

def config_obj_from_dic(dictionary):
    object = MBObject()
    for key, value in dictionary.iteritems():
        if isinstance(value, list):
            objects = list()
            for dic in value:
                objects.append(config_obj_from_dic(dic))
            value = objects
        setattr(object, key, value)
    return object

したがって、基本的にはメンバーのリストを作成し、それをオブジェクトのプロパティとして設定しようとします。繰り返し LocalStructuredProperty が必要であることが自動的に認識されることを願っています。明らかに、問題がどこにあるのか、それ自体を処理するほど賢くないことがわかります。問題は、それをどのように処理するかです。

また、LocalStructuredProperty で機能しない場合は、ndb.JsonProperty を使用しても問題ありませんが、それでも同じ問題があります。これを特定のタイプのプロパティにしたいことを動的に伝えるにはどうすればよいでしょうか?

tl;dr: Expando モデルがありsetattr(object, key, a_list)、プロパティをリストとして設定する場合、 aLocalStructuredPropertyまたは aが必要であることをどのように知らせるJsonPropertyことができますか?なぜなら、そのリストをどう処理するかがわからないからです。 .

4

2 に答える 2

2

NDB expando モデルは、GenericPropertyを使用してデータを設定します。これは、int、long、float、bool、str、unicode、datetime、Key、BlobKey、GeoPt、User、None のタイプのみをサポートします。

この問題を解決するには: のすべてのプロパティと名前がわかっている場合はmembers、事前定義されたプロパティ (ドキュメントで説明) を持つ expando モデルを として使用できますLocalStructuredProperty。ただし、これがわからない場合 (expando を使用しているため、これは理にかなっています)、これらのメンバーを手動で JSON にシリアル化し、expando プロパティに文字列として保存することをお勧めします。

于 2012-11-14T10:36:51.493 に答える
2

この問題が発生する可能性があります: http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=216

この修正は、AppEngine SDK の次のリリースで行われる予定です。これを行うには、最初に Expando モデルを Expando モデル内に格納する必要があるようです (問題ページから取得)。

def test_expando_in_expando_with_lists(self):
        """Passes"""
        class B(ndb.Expando):
            pass
        class A(ndb.Expando):
            pass
        a = A(a1 = [B(b1 = [0,1,2,3]),B(b2='b2test')])
        new_a = A(**a.to_dict())
        self.assertEqual(a, new_a)

上記の例の構造を見てa.to_dict()、辞書オブジェクトが自分のものと比較してどのように見えるかを確認します。また、これは LocalStructuredProperty ではなく、StructuredProperty になると思います。

プロパティ タイプを事前に定義できる場合、この問題は同様のバグを修正しました: http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=207

于 2012-11-15T16:52:08.357 に答える