python – 如何在App Engine中表示一对一的关系

假设您有一个“用户”记录的概念,您希望将其存储在数据存储中.

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)

你可以在UserTwitterOauth中为User提供一个ReferenceProperty,但这实际上是一对多的,因为没有什么能阻止每个用户使用多个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的类,除非您对导入非常小心,否则当您打算引用另一个时,最终可能会引用一个.

上一篇:删除mysql中的数据,减少mysql大小


下一篇:碎片或不碎片? GAE / JAVA / JDO