假设您有一个要存储在数据存储中的“用户”记录的概念。

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,在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)

您可以将ReferenceProperty放在UserTwitterOauth中的用户,但这实际上是一对多,因为每个用户都有多个UserTwitterOauth对象是没有任何限制的您希望最多有一个usertwitterOAuth与任何用户相关。你如何在一对一的基础上联系这些模型?

最佳答案

在这种特定情况下,您最好的选择可能是使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对于实体来说是一个危险的名称-Users API也有一个名为User的类,除非您非常小心地处理导入,否则当您打算引用另一个时,可能会引用其中一个。

10-07 12:09