3

アプリをデータストアから ndb に変換していますが、xml インポート ルーチンで問題が発生しました。問題は、ndb.model クラスのプロパティが多値プロパティかどうかをプログラムで判断できないことです。

私がこれまでに思いついたコードは値が「目に見える」ことを示しているので、これは基本的な Python スキルの欠如が原因であると思われます。したがって、私はそれをつかむことができません。助けてください。

from google.appengine.ext import ndb

class House(ndb.Model):
  name = ndb.StringProperty()   
  rooms = ndb.StringProperty(repeated=True) 

print 'Properties:'
for p in House._properties:
  print getattr(House,p)

print '\nRepeated:'
for p in House._properties:
  print getattr(getattr(House,p),'repeated',None)

これにより、次の結果が得られます。

Properties:
StringProperty('rooms', repeated=True)
StringProperty('name')

Repeated:
None
None
4

2 に答える 2

8

実際には、アンダースコアがプレフィックスのオプション公式の API です。それらが文書化されていないのはバグです。修正します。ここでもう少し説明しました: http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=187

特に、モデルのプロパティを取得するには、Nick が提案したコードではなく、House._properties を使用する必要があります。(実際、__dict__将来の NDB バージョンではスロットに置き換えられる可能性があります。)

于 2012-05-22T14:58:09.747 に答える
6

NDBは現在、作成されたモデルをイントロスペクトするためのオプションを提供していません。あなたは間違いなくこれについてバグを提出する必要があります。それまでの間、オブジェクトの内部を突くことがそれを回避する唯一の方法です。内部実装の詳細はいつでも変更される可能性があり、変更される可能性があるため、これは非常に脆弱であることに注意してください。

次のようなプロパティのリストを取得できます。

properties = [(k, v) for k, v in House.__dict__.items() if isinstance(v, ndb.Property)]

インスタンスの内部属性にアクセスすることで、プロパティが繰り返されているかどうかを判断できますが_repeated、これがおそらく悪い考えである理由については、上記の免責事項を参照してください。

House.rooms._repeated

また

getattr(House, 'rooms')._repeated
于 2012-05-22T01:03:06.780 に答える