Неожиданное поведение структурированного свойства ndb - PullRequest
0 голосов
/ 26 ноября 2018

Я использую структурированное свойство ndb в моем приложении.Модели выглядят так:

Ресурс Внешняя интеграция:

class ResourceExternalIntegration(ndb.Model):
  integration_type = ndb.StringProperty()
  external_resource_type = ndb.StringProperty()
  external_resource_id = ndb.IntegerProperty()
  external_group_id = ndb.IntegerProperty()
  external_resource_name = ndb.StringProperty()

Resouce Модель:

class Resource(ndb.Model):
  owner = ndb.IntegerProperty()
  name = ndb.StringProperty()
  type = ndb.StringProperty()
  external_integrations = ndb.StructuredProperty(ResourceExternalIntegration, repeated=True)

Примечаниечто у меня структурированное свойство как repeated=True

Проблема: У меня есть функция в классе Resource, которая форматирует / сериализует данные, извлеченные из БД.Это выглядит так:

    def serialize(self):

    external_integrations_list = []
    if self.external_integrations:
        for external_integration in self.external_integrations:
            external_integration_dict = dict()
            external_integration_dict['integration_type'] = external_integration.integration_type,
            external_integration_dict['external_resource_type'] = external_integration.external_resource_type,
            external_integration_dict['external_resource_id'] = external_integration.external_resource_id
            external_integration_dict['external_group_id'] = external_integration.external_group_id
            external_integration_dict['external_resource_name'] = external_integration.external_resource_name
            external_integrations_list.append(external_integration_dict)

    resource_data.update(dict(
        owner=self.owner,
        name=self.name,
        type=self.type,
        external_integrations=external_integrations_list

    ))
    return resource_data

Теперь в resource_data атрибут external_integrations должен быть массивом, и каждый элемент в нем также должен быть массивом, то есть external_resource_id, external_resource_type и т. Д.также быть массивом.Это связано с тем, что структурированное свойство было установлено как repeated=True.Но resource_data не содержит этого ожидаемого результата.Это выглядит так:

{'name': u 'Scissors lift', 'type': u 'Scissors', 'external_integrations': [{'external_resource_type': (u'FLEET ',),' тип_интеграции': (u'ABC',), 'external_resource_id': 212017856321402L, 'external_resource_name': u "Тест 1", "external_group_id": 5000}], "owner": 5629490125014563L}

И в браузереэто выглядит так:

external_group_id: 5000
external_resource_id: 212017856321402
external_resource_name: "Test 1"
external_resource_type: ["FLEET"]
integration_type: ["ABC"]

т.е. external_group_id, external_resource_id, external_resource_name не отображаются в виде массива, но они ожидаются как массивы.

У меня также есть другая модель, в которой структурированное свойство не существует как repeated=True.Это выглядит так:

Внешняя интеграция

class ExternalIntegration(ndb.Model):
  access_token = ndb.StringProperty()
  group_ids = ndb.IntegerProperty(repeated=True)

Профиль

class profile(ndb.Model):
  name = ndb.StringProperty()
  integration_info = ndb.StructuredProperty(ExternalIntegration)

Здесь функция сериализации профилямодель показывает результат как:

{'gration_info ': {' group_ids ': ([5000],),' access_token ': (u'blahblahblahblah',)}, '' name: 'Test'}

И в браузере результат выглядит так:

access_token: ["blahblahblahblah"]
group_ids: [[5000]]

Я не могу понять, почему access_token отображается как массив и почему groups_ids является массивом массива.

Может кто-нибудь помочь мне понять такое поведение структурированного свойства ndb?В частности, случаи, которые я объяснил выше.

1 Ответ

0 голосов
/ 26 ноября 2018

Здесь есть два вопроса:

Относительно модели профиля :

Integration_info содержит два элемента, определенных в классе ExternalIntegration.Он сохраняется как словарь, содержащий два элемента: access_token и group_ids.group_ids определяется с помощью repeated=True, , который принимает список значений базового типа , который создает список.Подводя итог:

  1. access_token отображается в виде строки.
  2. group_ids отображается в виде списка, поскольку для repeated установлено значение True.

Относительно модели ресурсов :

  1. external_integrations отображаются в виде списка, поскольку вы определили repeated=True.
  2. В списке есть только один элемент, потому что весь словарь был добавлен в одной операции, вместо элемента на элемент.
  3. external_group_id, external_resource_id и external_resource_name не отображаются в виде массива, поскольку они не были определены с помощью repeated=True.Определение применяется на один уровень выше, к external_integrations, а не к каждой из содержащихся в нем строк.

Попробуйте переопределить элементы, которые должны повторяться, и те, которые не должны.

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