Метод 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.
Ответы
Ответ 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()
из коробки.