Как перенести добавленное свойство класса Python в модель ndb? - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время у меня есть модель в NDB, и я хотел бы добавить к ней новое свойство.Допустим, у меня есть следующее:

class User(Model, BaseModel):
    name = ndb.StringProperty(required=False)
    email = ndb.StringProperty(required=False)

    @property
    def user_roles(self):
        return UserRole.query(ancestor=self.key).fetch()

    @property
    def roles(self):
        return [user_role.role for user_role in UserRole.query(ancestor=self.key).fetch()]

Теперь, скажем, я добавил еще один property, называемый market_id.Например,

class User(Model, BaseModel):
    name = ndb.StringProperty(required=False)
    email = ndb.StringProperty(required=False)

    @property
    def user_roles(self):
        return UserRole.query(ancestor=self.key).fetch()

    @property
    def roles(self):
        return [user_role.role for user_role in UserRole.query(ancestor=self.key).fetch()]

    @property
    def market_id(self):
        """ fetches `id` for the resource `market` associated with `user` """
        for each_role in UserRole.query(ancestor=self.key):
            resource = each_role.role.get().resource
            if resource.kind() == 'Market':
                return resource.id()

        return None

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

Поскольку я имею дело со свойством класса Python, я предполагаю, что миграция не требуется.Но как столбец с именем roles уже существует?А почему недавно добавленное свойство с именем market_id не имеет?Требуется ли миграция?

1 Ответ

0 голосов
/ 22 октября 2018

Предлагаемое вами изменение не является действительным ndb изменением модели, поскольку вы не добавляете, не удаляете и не изменяете какие-либо свойства хранилища данных модели.Только ndb.Property дочерние классы являются действительными ndb свойствами модели, которые сохраняются, когда объект помещается () в хранилище данных.

Свойство, которое вы добавляете, является классом Python @свойство - не имеет ничего общего с тем, что находится в хранилище данных.

Так что для этого конкретного случая миграция не требуется.

Обновление вопроса делает это еще более ясным, я считаю.market_id @property не является свойством сущности хранилища данных User.Чтобы получить значения для него, вам не нужно обновлять сущность User, но вы должны создавать / редактировать соответствующие UserRole сущности с их свойством resource, указывающим на сущность Market.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...