假设您有一个“用户”记录的概念,您希望将其存储在数据存储中.
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的类,除非您对导入非常小心,否则当您打算引用另一个时,最终可能会引用一个.