0

再び初心者の質問で申し訳ありません。

しかし、ここでは非常に簡単なことをしようとしていますが、方法がわかりません。ドキュメントは、機能しない、または適用できないヒントを教えてくれます。

POST リクエストを受け取り、そこから変数を取得します。「名前」だそうです。

エンティティ オブジェクト (たとえば) 全体を検索し、同じ名前のオブジェクトがあるかどうかを確認する必要があります。この名前で新しいエンティティを作成する必要があります。簡単に見えるかもしれませんが、私は失敗し続けます。本当に助けていただければ幸いです。

私のコードは現在これです:

 objects_qry = Object.query(Object.name == data["name"])

        if (not objects_qry ):
            obj = Object()
            obj .name =  data["name"]
            obj .put()

class Object(ndb.Model):
    name        = ndb.StringProperty()
4

2 に答える 2

5

クエリを使用してこの操作を実行するのは、非常に非効率的です。

さらに、コードが信頼できない可能性があります。name が存在せず、name に対して同時に 2 つのリクエストがある場合、2 つのレコードが作成される可能性があります。クエリは name プロパティが何らかの値に等しい最初のエンティティのみを返すため、わかりません。

名前のエンティティは 1 つしかないと予想されるため、クエリは高価で非効率的です。したがって、get_or_insert を使用するか、単に get を実行するかの 2 つの選択肢があり、値があれば新しいエンティティを作成します。

いずれにしても、キーの一部として名前を使用するコード サンプルがいくつかあります。

name = data['name']
entity = Object.get_or_insert(name) 

また

entity = Object.get_by_id(name)
if not entity:
    entity = Object(id=name)
    entity.put()
于 2013-10-02T22:57:17.407 に答える
2

呼び出し.queryはクエリオブジェクトを作成するだけで実行しないため、ブール値として評価しようとするのは間違っています。Query オブジェクトにはメソッドがfetchありget、それぞれ、一致するエンティティのリストまたは 1 つのエンティティのみを返します。

したがって、コードを書き直すことができます。

objects_qry = Object.query(Object.name == data["name"])
existing_object = objects_qry.get()

if not existing_object:
  obj = Object()
  obj.name = data["name"]
  obj.put()

とはいえ、プロパティの代わりに ID を使用することについてのコメントでのティムの指摘は、名前が一意であることを本当に気にしている場合には理にかなっています。上記のコードは、2 つの同時リクエストが同じ名前のエンティティを作成するのを止めません。

于 2013-10-02T17:43:01.157 に答える