Конструктор, который вы используете, всегда создает новую сущность.Когда вы сохраняете его, он перезаписывает любой другой объект с тем же ключом.
Альтернативный код, который вы предлагаете, также имеет проблему: он подвержен условиям гонки.Два экземпляра этого кода, выполняющиеся одновременно, могут оба определить, что сущность не существует, и каждый ее создать, в результате чего один перезаписывает работу другого.
То, что вам нужно, это Model.get_or_insert метод, который является синтаксическим сахаром для этого:
def get_or_insert(cls, key_name, **kwargs):
def _tx():
model = cls.get_by_key_name(key_name)
if not model:
model = cls(key_name=key_name, **kwargs)
model.put()
return model
return db.run_in_transaction(_tx)
Поскольку операция get и условная вставка выполняются в транзакции, условие состязания невозможно.