1

私たちのチームはAppEngineに比較的慣れておらず、まだロープを学んでいます。プレーンなndb.Modelモデル(つまり、派手なものは何もない)とwebapp2ハンドラーを使用しています。このアプリは、安らかなAPIであるため、UIがありません。

したがって、次のように定義されたモデルがあります。

from google.appengine.ext import ndb
class Pasta(ndb.Model):
 type = ndb.StringProperty(indexed=True)
 name = ndb.StringProperty()
 contents = ndb.JsonProperty()
 modified_date = ndb.DateTimeProperty(auto_now=True)
 added_date = ndb.DateTimeProperty(auto_now_add=True)

また、ユースケースでは、レコードが存在しない場合はレコードを追加し、存在する場合はレコードを返します。ハンドラーでクエリを実行し、そこで作成して、pasta.put()インスタンスメソッドを使用して新しいものを作成することもできます。ただし、データバインドされたコードはハンドラーではなくモデルに属していると思いますが、間違っていない場合は、モデルのコンテキストでget_or_insert()キーを明示的に宣言する必要があるを使用する必要があります。

モデルでこの種のロジックを処理する方法について何か提案はありますか?TIA。

4

3 に答える 3

1

コードをモデルに入れるかハンドラーに入れるかの決定によって、クエリを実行するために使用する方法が決まるとあなたが考える理由がわかりません。どちらの場所でも使用できますget_or_insertが、必要なエンティティのキ​​ーを知る必要があることを意味します。また、どちらの場所でもクエリを実行できます。

すべてのデータのやり取りをモデル内に保持したい場合、考えられるパターンの 1 つは、クエリを実行して既存のインスタンスまたは新しいインスタンスのいずれかを返すモデルでクラスメソッドを定義することです。何かのようなもの:

class Pasta(ndb.Model): 
    ...
    @classmethod
    def get_or_create(cls, type=None, name=None):
        query = cls.query(cls.type=type, cls.name=name)
        existing = query.get()
        if existing:
            return existing
        else:
            new_item = cls(type=type, name=name)
            new_item.put()
            return new_item

(実際に ndb を使用したことはありませんが、これは多かれ少なかれ正しいことに注意してください。) このメソッドがトランザクション内で呼び出されることを確認する必要があります。

于 2012-11-13T16:51:34.213 に答える
0

キーアクセスは、クエリよりも高速で安価です。クエリを実装する前に、IDを使用できないことを常に判断することをお勧めします。また、すべてのモデルプロパティのデフォルトのインデックス状態はTrueであるため、モデルを設定するときは常にindexed = True/Falseを指定することをお勧めします。人々がデフォルトがTrueであることを忘れて、少数のプロパティに対してのみクエリを実行しているときに、なぜインデックスストレージが非常に大きくなるのか疑問に思う場合が多くあります。他のモデルプロパティのインデックスが必要ですか?

于 2012-11-13T18:55:47.490 に答える
0

インスタンス(またはレコード)の作成がモデルに属する理由について、非常に奇妙な議論があります。

はい、モデルはデータを表しますが、モデルのインスタンスを作成するのはハンドラーです。ハンドラーが何をするかについて十分な情報を提供していません。

まず、キーとして使用するものを決定する必要があります。ndb でランダムに作成されたキーを使用しているだけの場合、レコードが存在するかどうかを判断する方法がわかりません。Pasta.type または Pasta.name のいずれかをキーとして使用することをお勧めします。

この場合、「タイプ」または「名前」がパラメーターとしてハンドラーに提供される可能性が高く、ハンドラーはパラメーターからキーを構築した後に get_or_insert を呼び出します。

あなたの質問は、特定のパスタ モデルに対して 1 つのレコードのみが必要であると解釈することもできます。これはかなり非典型的なデータストアの使用法ですが、その場合、単一のインスタンスが存在するかどうかを確認するメソッドをモデルに含めることが理にかなっている場合があります。その場合、キーをハードコーディングできます。

于 2012-11-13T17:28:14.380 に答える