2013-03-07 82 views
0
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函数。如何保证gae datastore名称/ ID的唯一性?

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

有没有一种方法可以确保这种独特性? enter image description here

回答

3

如果你允许GAE为你创建它们,你正在做的,它们将是唯一的。

然而父母也被考虑,因此从一个根实体开始并从父母到孩子,从而导致给定实体的实体序列构成该实体的祖先路径。

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

所以,如果你是手动生成这些ID手动你可以使用这样的分配100组的ID与父键P的实体:

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

注意父被包括在内。所以,你可以在以后的父●运行此:

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

虽然有些ID的返回可能是同一数量不引用相同的模型,因为父母被认为也(你在这个例子中实现)。

这里更多:https://developers.google.com/appengine/docs/python/ndb/entities

+0

如果你看到我上面的图片中,可以看到ID /名称的ID = 1,这是为什么发生? – tipsywacky 2013-03-07 10:38:15

+1

因为这只是显示密钥的最后一个组件。正如保罗所说,一旦你考虑到父母的整个路径,这是唯一的,你会看到一旦你点击。 – 2013-03-07 10:40:05

+2

可能值得关于种类和标识符的阅读https://developers.google.com/appengine/docs/python/datastore/entities#Kinds_and_Identifiers – 2013-03-07 10:47:07