あなたが持つ1つの問題は、User.ID
をユニークにすることが重要でないことです。問題は、データベースへの2回の書き込みが異なるシャード上で発生する可能性があることです。一意性制約に一致する既存のエントリをほぼ同時にチェックし、noneを見つけてから、(ユニークなプロパティに関して)無効なデータベース状態です。これを解決するために、Appengineは、特定のデータストアエンティティが常に同じ物理マシンに配置されることを保証する手段を提供します。
これを行うには、エンティティキーを使用して、エンティティの編成方法をGoogleに伝えます。ユーザー名が一意であることを想定します。 User
を次のように変更してください。
class User(db.Model):
datejoined = db.DateTimeProperty(auto_now_add=True)
はい、それは本当です。これはキーで使用されるため、ユーザー名はありませんので、別途表示する必要はありません。あなたが好きなら、あなたはこれを行うことができます...
class User(db.Model):
datejoined = db.DateTimeProperty(auto_now_add=True)
@property
def name(self):
return self.key().name()
User
のインスタンスを作成するには、あなたが今、少し違う何かをする必要があり、あなたは、initメソッドでkey_name
を指定する必要があります。
someuser = User(key_name='john_doe')
...
someuser.save()
まあ、本当にユーザーが互いを上書きしないことを確認するには、あなたがトランザクションでユーザー作成をラップする必要があります。 、
someuser = User.get_by_key_name('john_doe')
次へ:、その後
def create_user(username):
checkeduser = User.get_by_key_name(username)
if checkeduser is not None:
raise db.Rollback, 'User already exists!'
newuser = User(key_name=username)
# more code
newuser.put()
あなただけのこの操作を行うユーザーを見つけるには、このよう
db.run_in_transaction(create_user, 'john_doe')
でそれを呼び出す:まずneccesaryチェックを行う関数を定義しますコンテンツをユーザーに関連付ける方法と、その逆の方法が必要です。 1つの解決策は、ユーザをコンテンツの親として宣言することによって、コンテンツをユーザと同じエンティティグループに入れることである。これを行うには、あなたは、すべてのコンテンツを変更する必要はありませんが、あなたは(あなたがユーザーでやったくらいのように)少し違っそれを作成します。
somecontent = Content(parent=User.get_by_key_name('john_doe'))
ので、コンテンツアイテム与え、あなたがルックアップすることができますユーザはそのキーを調べることによって:
逆に言えば、特定のユーザのすべてのコンテンツを検索することは少し難解です。
allcontent = Content.gql('where ancestor is :user', user=someuser).fetch(10)
これはまさに私が探しているものです! –
@TokenMacGuy: 'newuser.save()'によって、 'newuser.put()'を意味しますか? – Kit