Как я могу запросить объекты Google App Engine по имени, чтобы преобразовать их в новые имена?

Я хочу преобразовать некоторые сущности в новые имена. Как я могу запрашивать объекты, для которых не определен класс модели.

Например, у меня есть такой объект (он упрощен, чтобы быть более читабельным):

class Some(ndb.model):
  name = ndb.StringProperty()

Я хочу переименовать его в:

class SomeFile(ndb.model):
  name = ndb.StringProperty()

Как мне это сделать?

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


person Chameleon    schedule 17.08.2015    source источник


Ответы (2)


Вы можете изменить имя класса модели, чтобы оно указывало на существующее хранилище данных Kind, переопределив метод _get_kind() модели.

class SomeFile(ndb.Model):
    @classmethod
    def _get_kind(cls):
      return 'Some'

Теперь вы можете использовать SomeFile в коде Python, сохраняя при этом объекты Some в своем хранилище данных.

https://cloud.google.com/appengine/docs/python/ndb/modelclass#introduction

person Josh J    schedule 17.08.2015
comment
Это какая-то идея. Что бы я ни хотел, измените все имена, чтобы упростить код. Я предпочитаю, чтобы Х было больше Х, чем Х было Y. - person Chameleon; 18.08.2015
comment
Ну, вы уже удалили старые названия моделей, так что это ваш вариант, или вы можете временно заменить старые модели, чтобы выполнить обмен, как в другом ответе. - person Josh J; 18.08.2015

Возможно, я не понимаю вашего вопроса, но это то, что вы хотите?:

for x in Some.query():
    y = SomeFile()
    y.name = x.name
    y.put()
    x.key.delete()

Хотя вы должны сделать это более эффективным, делая это партиями.

person gaefan    schedule 17.08.2015
comment
Я не могу работать, вы предполагаете, что класс Some существует, но будет заменен, а Some будет удален из-за мертвого кода. Я не могу поддерживать мертвый код, так как он блокирует разработку. - person Chameleon; 18.08.2015
comment
Я не понимаю вашего комментария... Если class Some() не существует, просто создайте его как Expando, чтобы вам не нужно было перечислять свойства. После преобразования вы удаляете это тривиальное определение class Some(), чтобы не поддерживать мертвый код. - person gaefan; 18.08.2015
comment
Это просто, я не могу иметь Some(ndb.Model), так как этот код должен быть удален после обновления, а не сохранен - ​​учтите, что после 100 патча у меня будет 50 Some(epxando) ... - это проблема, чтобы не хранить мертвые вещи. - person Chameleon; 19.08.2015