Метод ndb to_dict не включает ключ объекта - программирование
Подтвердить что ты не робот

Метод ndb to_dict не включает ключ объекта

Я использую метод ndb to_dict для преобразования свойств объекта в python dict. Из всего, что я могу сказать, этот метод не включает ключ объекта или родительский элемент в dict в соответствии с документацией:

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

Однако для моей ситуации мне нужен ключ, который будет в dict. Мое предпочтение состояло в том, чтобы использовать встроенный метод и подкласс или нечто подобное, а не создавать свой собственный метод to_dict.

Каков наилучший способ добиться этого или я пропущу что-то очевидное? Спасибо заранее.

FYI: я не использую django для этого проекта, но вместо этого прямой python развернут до gae.

4b9b3361

Ответ 1

Вы ничего не пропустили; -)

Просто добавьте ключ в словарь после вызова to_dict и да переопределите метод.

Если у вас есть несколько моделей, которые не используют один и тот же базовый класс с вашим пользовательским to_dict, я бы выполнил его как mixin.

чтобы определить to_dict как метод класса Mixin. вы бы

class ModelUtils(object):
    def to_dict(self):
        result = super(ModelUtils,self).to_dict()
        result['key'] = self.key.id() #get the key as a string
        return result

Затем использовать его.

class MyModel(ModelUtils,ndb.Model):
    # some properties etc...

Ответ 2

Другим простым способом добиться этого (без переопределения to_dict) является добавление ComputedProperty, который возвращает идентификатор, например:

class MyModel(ndb.Model):

  # this property always returns the value of self.key.id()
  uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False)

  # other properties ...

A ComputedProperty будет добавлен к результату to_dict точно так же, как и любое другое свойство.

Есть только два ограничения:

  • По-видимому, имя свойства не может быть key (так как это противоречило бы фактическому ключу), а id тоже не работает.
  • Это не будет работать, если вы не укажете ключ или идентификатор при создании объекта.

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

Преимущество состоит в том, что это поддерживает аргументы include и exclude to_dict() из коробки.