3

Google アプリ エンジンと python で NDB を使用してこのエラーが発生しました: 独自のプロパティを繰り返している StructuredProperty None を繰り返すことはできません。

作成後にプロパティを入力できるように、新しい空の文字を作成するプロセスでエラーが発生するため、「なし」です。

私のエンティティ「Character」に、エンティティ「curse」を含む繰り返し構造化されたプロパティを持つ別のエンティティ「Weapon」を含む、繰り返し構造化されたプロパティ「weaponList」を持たせたいとは思わないでしょう。 .

スティーブ・ハフマンと一緒に Udacity の cs253 に参加して 5 週間ほど経ちましたが、私は危険であることを十分に知っているようです。そのため、これが問題であることを確認し、目標を達成するためのより良い解決策を見つけられることを願っています。

基本的に、私はダンジョンズ アンド ドラゴンズ風のキャラクター管理システムを作成しています。このシステムには、GM/プレイヤーのリアルタイム メッセージング機能とキャラクター シートの更新機能があり、Google+ ハングアウト RPG プレイヤーの増加に役立つと考えています。武器、アイテム、呪い、魔法の効果のリストをすべて別々のエンティティとして持っているので、それらを自由に組み合わせて組み合わせることができます。

武器とアイテムには、呪いや優れた魔法の効果をいくつでも持つことができます。キャラクターは武器をいくつでも持つことができます。最初は、エンティティ キーのリストを保存するのがいいと思いました。次に、データベースから各武器を個別に取得し、各武器の各呪いを取得する必要があると考えました...それを行うには非効率的な方法のように思えました.

さらに、プレイヤーと GM はカスタマイズするのが大好きで、これはそれに向いていません。それで、私は1つのテーブルに標準のもののリストを持つことができ、それをキャラクターに「追加」すると、繰り返し構造化されたプロパティでそのキャラクターに特別にコピーされ、地獄をカスタマイズすることができます他の人に影響を与えることなく、または私が余分な作業を行うことなく、それを実行できます。

しかし、それは機能していないので、結果としてリスト内のリスト内のリストが終了しない可能性が非常に高いため、許可されていないと思います。より良い方法は何ですか?

4

2 に答える 2

6

構造化プロパティのドキュメントには、次のように明確に記載されています。

aStructuredPropertyを繰り返すことも、StructuredProperty別のプロパティを含めることもできますがStructuredProperty、注意してください。ある構造化プロパティに別のプロパティが含まれている場合、繰り返すことができるのはそのうちの1つだけです。回避策はLocalStructuredProperty、この制約がない(ただし、プロパティ値のクエリを許可しない)を使用することです。

于 2012-08-15T14:14:39.650 に答える
3

私の仲間の初心者のための私自身の質問に答えるために。簡単な答え-LocalStructurePropertyを使用します。私の理論では、ネストされたリストにインデックスを作成することは(Googleが自動的に行う)、まあ、ばかげているだろう。ドキュメントは、少なくとも私の読書から、これを実際に指定していません。あるいは、それを「取得」するのに十分な知識がない可能性があります。ただし、LocalStructuredPropertiesはインデックスを作成しないため、セットアップは正常に機能します。リスト形式のデータベースオブジェクトのローカルコピー(参照ではない)が必要な場合(プロパティとしてローカルリストもあります)、localStructuredPropertyが必要になる場合があります。

これについてもう少し詳しく説明したいと思います。標準のデータストアとNDBjsonプロパティのデータ型を使用して試したいくつかのオプション

私のモデルクラスがこのようになる前に

class Character(ndb.Model):
    name = stringProperty()
    weaponList = StructuredProperty(WeaponModel.Weapon, repeated=True)

class WeaponModel(ndb.Model):
    name = stringProperty()
    curseList = StructuredProperty(BufferModel.Curse, repeated=True)

class BufferModel(ndb.Model):
    name = stringProperty()

上記のエラーが返されました:StructuredPropertyを繰り返すことはできません独自のプロパティを繰り返したものはありません。

私はおそらく解決策の調査をすることにしました。

1)基本的なデータストアデータベース(ndbではない)に切り替え、すべてをListプロパティに変更しました

WeaponList = ListProperty(WeaponModel.Weapon)//ここにデータ型を渡して、何が格納されるかを認識できるようにする必要があります

Listpropertyは、既知のデータストアタイプ(キー、文字列、整数)のリストのみを許可することが判明しました。そのため、モデルエンティティの保存は機能しませんでした。ただし、キーのリストを保存することはできます。

武器リスト=ListProperty(db.key)

それは適切に機能します。ユーザーが独自の武器を編集または作成できるようにするには、武器に作成者プロパティを追加し、それまたはパブリックまたはプライベートなどの他の参照に基づいてクエリを実行します。

そのアイデアは本当に好きではありませんでした。どういうわけか、スパゲッティモンスターのビジョンが頭に浮かび続けたので、私は考えました-NDBのこのjsonオブジェクトの男はどうですか?

そのことを構築するためのほとんどの擬似コードバージョンは次のようになります。

aCurse = getcurse
aJsonCurse = json.dump(aCurse)
aWeapon = getWeapon(curseList=[aJsonCurse])
aJsonWeapon = json.dump(aWeapon)


aCharacter.weaponList = [aJsonWeapon]

しかし、それは簡単には機能しませんでした。武器には以前にjsonオブジェクトがあり、それ自体がjsonにダンプされていたため、ネストされたjsonを使用して武器をダンプするのはあまり良くありませんでした。作り方を変えて回避しましたが、スパゲッティモンスターがやって来て笑い始めたので、立ち止まってランチに行きました。

私が戻ってきたとき、私はドキュメントをもう一度見るだろうと思いました。構造化とLocalStructuredの唯一の書面による違いは、インデックスがないことでした。これは役に立たなかったようですが、とにかく試してみることにしました。これで問題なく動作します。ええと、私はエラーを起こしていません。必要に応じてエンティティを取得できます。誰がどのような危険が待ち受けているかを知っています。

うまくいけば、これは何人かの盲目の男性を正しい方向に向けるでしょう。

于 2012-05-21T19:31:56.413 に答える