1

У меня есть набор сущностей с родительскими ключами и идентификаторами строк. Иногда мне нужно изменить идентификатор строки (обновить объект с новым идентификатором). Из этого вопроса (Modify a Google App Engine entity id?), похоже, мне нужно создать новый объект и удалить старый.Каков наилучший способ клонирования объекта NDB?

Конечно, я хочу сохранить все свойства старого объекта при создании нового, но, похоже, для объектов NDB не существует метода clone.

Это лучший способ изменить идентификатор объекта, сохраняя при этом родителя?

# clone the old_entity and parent as new_entity 
new_entity = MyModel(**old_entity.to_dict(), id=new_id, parent=old_entity.parent()) 

И потом, я должен быть в состоянии сделать это, чтобы заменить старый объект с новым:

new_entity.put()   # save the new entity 
old_entity.key.delete()  # delete the old entity 
+0

Вы можете réf запись [копию entity] (http://stackoverflow.com/questions/2687724/copy-anentent-in-google-app-engine-datastore-in-python-without-knowing-property) для объекта копирования. – Sanch

+0

http://stackoverflow.com/questions/14314344/how-to-copy-all-entities-in-a-kind-in-gae-to-another-kind-without-explicitly-cal –

ответ

2
def clone_entity(e, **extra_args): 
    klass = e.__class__ 
    props = dict((v._code_name, v.__get__(e, klass)) for v in klass._properties.itervalues() if type(v) is not ndb.ComputedProperty) 
    props.update(extra_args) 
    return klass(**props) 

пример

b = clone_entity(a, id='new_id_here') 
+0

Это не задано «родительский» ключ, не так ли? –