2013-03-07 3 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) 

Итак, у меня есть эти сущности, и когда я добавляю сущность приложения, я всегда устанавливаю родительский объект в сообщение. См. Функцию addApplication выше.Как гарантировать уникальность gae datastore Имя/ID?

Однако каждый раз, когда я создавал приложение. Имя/ID в хранилище данных создаст id = 1 (см. Изображение ниже), которое я думал, что gae будет создавать уникальный номер, например 39001.

Есть ли способ, который я могу обеспечить уникальность этого? enter image description here

ответ

3

Если вы разрешите GAE создавать их для вас, как вы делаете, они будут уникальными.

Однако родитель также считается, поэтому последовательность объектов, начинающихся с корневого объекта и исходящих от родительского к дочернему, приводя к данному объекту, представляет собой путь предка объекта.

Полный ключ идентификации объекта, таким образом, состоит из последовательности пар идентификаторов вида, определяющих его путь предка и заканчивающихся с помощью самой сущности.

Так что, если вы должны были вручную сгенерировать эти идентификаторы вручную, вы могли бы использовать что-то вроде этого, чтобы выделить 100 идентификаторов для объектов с родительским ключом р:

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

Примечания родительским включено. Таким образом, вы можете запустить это позже для родительского д:

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

И хотя некоторые из идентификаторов вернулся может быть один и тот же номер, они не ссылаются на ту же модель, потому что родитель считается также (который вы реализуете в этом примере).

Подробнее здесь: https://developers.google.com/appengine/docs/python/ndb/entities

+0

Если вы видите мое изображение выше, вы можете увидеть ID/Name являются ID = 1, почему это происходит? – tipsywacky

+1

Потому что это только показывает вам последний компонент ключа. Как говорит Павел, он уникален, когда вы принимаете во внимание весь путь от родителя, который вы увидите, как только вы нажмете. –

+2

Возможно, стоит прочитать информацию о типах и идентификаторах https://developers.google.com/appengine/docs/python/datastore/entities#Kinds_and_Identifiers –