如何保证gae数据存储区名称/ ID的唯一性?

时间:2013-03-07 09:42:34

标签: python google-app-engine google-cloud-datastore

class Post(db.Model):
    user = db.ReferenceProperty(User, collection_name='posts')
    title = db.StringProperty(required=True)
    desc = db.TextProperty()
    def addApplication(self, user, message, contact_info=""):
         new_app = TaskApplication(parent=self, user=user, message=message, contact_info=contact_info)
         new_app.put()

class Application(db.Model):
    user = db.ReferenceProperty(User, collection_name='applications')
    contact_info = db.StringProperty()
    message = db.TextProperty()
    created = db.DateTimeProperty(auto_now_add=True)

所以我有这些实体,当我添加一个应用程序实体时,我总是将父设置为Post。请参阅上面的addApplication函数。

但是,每次我创建一个应用程序时。数据存储区中的名称/ ID将创建id = 1(请参见下图),我认为gae每次都会创建一个唯一的数字,如39001。

有没有办法确保这种独特性? enter image description here

1 个答案:

答案 0 :(得分:3)

如果您允许GAE为您创建它们,它们将是唯一的。

但是也考虑了父项,因此以root实体开始并从父项继续到子项的实体序列(通向给定实体)构成该实体的祖先路径。

标识实体的完整密钥因此由一系列种类 - 标识符对组成,指定其祖先路径并以实体本身的路径终止。

因此,如果您手动手动生成这些ID,您可以使用类似的内容为父键p的实体分配100个ID:

first, last = MyModel.allocate_ids(100, parent=p)

请注意包含父级。所以你可以稍后为父q运行:

first, last = MyModel.allocate_ids(100, parent=q)

尽管返回的某些ID可能是相同的数字,但它们不会引用相同的模型,因为也会考虑父项(在此示例中实现)。

更多信息:https://developers.google.com/appengine/docs/python/ndb/entities