GAE Ndb: транзакция внутри pre_put_hook? или как создать уникальный идентификатор на лету

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

Другими словами, вы можете назначить это так:

last_entity = MyEntity.query().order(-MyEntity.num).get()
max_num = last_entity.num
new_num = max_num + 1

И вы захотите сделать это в рамках @transactional, пока вы не поместите () вновь созданную сущность.

Казалось бы, хорошее место, чтобы назначить num атрибут (если еще не установлен) может быть в _pre_put_hook(), Но я не думаю, что мог бы начать транзакцию в _pre_put_hook() функция, которая будет включать в себя заключительный put() объекта.

Так как же лучше всего с этим справиться?

Другой подход заключается в определении assign_num_and_put() функция, которая будет открывать транзакцию (скажем, делать get для родительской сущности), затем находить max_num, назначать max_num + 1 новой сущности и выполнять put(), все внутри транзакции.

0 ответов

Другие вопросы по тегам