3

データストアに保存したい「ユーザー」レコードの概念があるとします。

class User (db.Model):
  first_name = db.StringProperty()
  last_name = db.StringProperty()
  created = db.DateTimeProperty(auto_now_add=True)
  twitter_oauth_token = db.StringProperty()
  twitter_oauth_secret = db.StringProperty()

first_name や last_name のように、ユーザー オブジェクトを使用するたびに必ず使用したいフィールドがいくつかあります。

ただし、twitter_oauth_token や twitter_oauth_secret など、ユースケースが 1 つしかないフィールドもあり、これらが 95% の確率で必要とされない場合に、これらをシリアライズおよびデシリアライズするのはやや非効率的です。

したがって、モデルを分割する場合:

class User (db.Model):
  first_name = db.StringProperty()
  last_name = db.StringProperty()
  created = db.DateTimeProperty(auto_now_add=True)

class UserTwitterOauth(db.Model):
  oauth_token = db.StringProperty(required=True)
  oauth_secret = db.StringProperty(required=True)
  created = db.DateTimeProperty(auto_now_add=True)

UserTwitterOauth で User に ReferenceProperty を配置できますが、これは実際には 1 対多になります。任意の User に関連する UserTwitterOauth は最大で 1 つにする必要があります。これらのモデルを 1 対 1 で関連付けるにはどうすればよいでしょうか?

4

2 に答える 2

6

この特定のケースでは、次のように、エンティティを既知のキー名を持つUserTwitterOauthエンティティの子にすることがおそらく最善の方法です。User

my_user = User(first_name="John", last_name="Smith")
my_user.put()
extra_info = UserTwitterOauth(parent=my_user, key_name="UserTwitterOauth")
extra_info.put()

簡単なメソッドまたはプロパティをUserクラスに追加して、追加情報を簡単に取得できるようにし、クラス メソッドをUserTwitterOauthファクトリ メソッドとして機能させて、規則を維持することができます。

ちなみに、Userはエンティティの危険な名前であるUserことに注意してください。Users API にも呼び出されるクラスがあり、インポートに十分注意しないと、一方を参照するときに他方を参照してしまう可能性があります。

于 2011-06-08T00:31:40.907 に答える
0

私の見解では、Twitterアクセス​​トークンからのユーザーへの参照プロパティは、維持するのがはるかに簡単です。ユーザーが多くのアクセストークンによって参照される可能性があるのは事実です。

ただし、GAEを使用している場合は、慣例により多くのことを実行していることに気付くでしょう。

同じユーザーを参照する複数のアクセストークンを防ぐ編集:

プロパティを介して、参照アクセストークンにクエリとしてアクセスできますUser.usertwitteroauth_set。よりわかりやすい名前が必要な場合はcollection_name、ReferencePropertyを設定するときにパラメーターを指定します。たとえば、新しいトークンを追加する前に参照アクセストークンを削除したい場合は、そのロジックを次のように収集できます。

class User(db.Model):
    def set_access_token(self, access_token):
        db.delete(self.twitter_access_tokens) # Think this should work, otherwise iterate over the query.
        new_access_token.user = self
        new_access_token.put()


class UserTwitterOauth(db.Model):
    user = db.ReferenceProperty(User, collection_name = 'twitter_access_tokens')
于 2011-06-07T16:39:21.390 に答える