Чтение встроенной сущности из клиента Python ndb - PullRequest
0 голосов
/ 10 мая 2018

Я использую клиент Python для облачного хранилища данных Google, чтобы записать сущность в хранилище данных, которое содержит встроенную сущность. Пример объекта может выглядеть следующим образом:

data_type: 1
raw_bytes: <unindexed blob>
values: <indexed embedded entity>

Я проверил данные с консоли, данные сохраняются правильно и значения присутствуют.

Далее мне нужно выполнить запрос из приложения механизма приложений Python. Я представил это как следующую сущность в коде моего движка приложения:

class DataValues(ndb.Model):
    param1 = ndb.BooleanProperty()
    param2 = ndb.IntegerProperty()
    param3 = ndb.IntegerProperty()

class MyEntity(ndb.Expando):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = ndb.StructuredProperty(DataValues)        

Один из фильтров в запросе зависит от свойства в values. Пример кода запроса приведен ниже:

MyEntity.query().filter(MyEntity.data_type == 1).filter(MyEntity.values.param1 == True).get()

Я создал соответствующий составной индекс в моем index.yaml Запрос выполняется успешно, но результирующий объект содержит встроенный объект values как None. Все остальные значения свойств присутствуют.

В чем здесь проблема?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Добавление свойств объекта DataValues в качестве свойств MyEntity.

0 голосов
/ 05 апреля 2019

Я боролся с той же проблемой, желая преобразовать встроенную сущность в словарь Python. Одним из возможных решений, хотя и не очень элегантным, является использование GenericProperty:

class MyEntity(ndb.Model):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = ndb.GenericProperty()

values будет считываться как объект "Expando": Expando(param1=False,...). Вы можете получить доступ к отдельным значениям с помощью values.param1, values.param2 и т. Д. Я бы предпочел иметь собственный класс модели, но это должно сработать.

0 голосов
/ 10 мая 2018

Это немного догадка, но поскольку атрибуты хранилища данных имеют вид как по названию (в данном случае values) , так и по названию «тип / класс поля» (т.е. StructuredProperty), это может решить вашу проблему:

class EmbeddedProperty(ndb.StructuredProperty):
    pass

class MyEntity(ndb.Expando):
    data_type = ndb.IntegerProperty(required=True)
    raw_bytes = ndb.BlobProperty()
    values = EmbeddedProperty(DataValues) 

Сделайте попытку и дайте мне знать, если values начнет возвращаться ненулевым.

...