Родитель находится в хранилище данных, назначьте дочерние элементы, загруженные с помощью загрузчика CSV.

В настоящее время у меня есть Team в хранилище данных:

team = Team.get_by_key_name('Plants')

И у меня есть следующий файл CSV на моем локальном компьютере:

name,level
Pea Shooter,1
Threepeater,3
Melon-pult,20

Мой bulkloader.yaml выглядит так:

python_preamble:
- import: models
- import: my_transforms

transformers:
- kind: Character
  connector: csv
  property_map:
  - property: name
    external_name: name

  - property: level
    external_name: level
    import_transform: my_transforms.transform_integer

Я написал models.py, который выглядит так:

from google.appengine.ext import db

class Team(db.Model):
  name = db.StringProperty()

class Character(db.Model):
  name = db.StringProperty()
  level = db.IntegerProperty()

Я также написал my_transforms.py:

def transform_integer(integer_string):
  return int(integer_string)

Вопрос. Как загрузить CSV-файл, чтобы при входе Character в хранилище данных их свойства parent назначались team?


person Kit    schedule 27.07.2011    source источник


Ответы (3)


В первом ответе не хватает подробностей, но я смог почерпнуть из него некоторую информацию.

Я добавил еще один столбец в свой CSV-файл с именем Character.csv:

team,name,level
Plants,Pea Shooter,1
Plants,Threepeater,3
Plants,Melon-pult,20

Теперь bulkloader.yaml выглядит так:

python_preamble:
- import: models
- import: my_transforms

transformers:
- kind: Character
  connector: csv
  property_map:
  - property: __key__
    external_name: team
    import_transform: transform.create_deep_key(('Team', 'team', False),
                                                ('Character', 'name', False))

  - property: name
    external_name: name

  - property: level
    external_name: level
    import_transform: my_transforms.transform_integer

Затем я делаю следующее в терминале:

$ cd /path/to/app
$ appcfg.py upload_data --config_file=bulkloader.yaml \
                        --filename=Character.csv \
                        --kind=Character \
                        --url=http://localhost:8082/_ah/remote_api
person Kit    schedule 28.07.2011
comment
Я пытаюсь сделать то же самое, что и @Kit: назначить родителя при массовой загрузке. Я успешно загрузил родительские объекты, но возникли проблемы с загрузкой дочерних объектов, так как я не понимаю import_transform: transform.create_deep_key. Я думаю, вы решили ее, но я недостаточно умен, чтобы понять, что вы сделали или что это значит. Не могли бы вы объяснить свое решение? В частности, я не знаю цели False или того, что массовый загрузчик делает с вашими значениями Team, team. Не могли бы вы объяснить, что вы сделали для нас, дураков? Спасибо, Т. - person TrevorBrown; 26.10.2012
comment
А, кажется, я понял, из кода googleappengine: Аргументы: path_info: Список кортежей с описанием (вид, свойство, is_id=False). ... is_id: преобразует значение в int и обрабатывает как числовой идентификатор, если оно равно True, в противном случае значение является строковым именем. По умолчанию — Ложь. Возвращает: метод преобразования, который анализирует информацию из текущего нейтрального словаря в ключ с родителями, как описано в path_info. - person TrevorBrown; 26.10.2012

Родительская информация хранится в ключе, поэтому вы должны установить свойство __key__.

Чтобы создать многоуровневый ключ, вам нужно будет использовать google.appengine.ext.bulkload.transform.create_deep_key, который принимает path_info в качестве аргумента и возвращает метод преобразования, который анализирует текущий dict в ключ с родителями, указанными вами в path_info. Для получения дополнительной информации прочитайте строку документации в фактическом методе, который можно найти в APPENGINE_ROOT/google/appengine/ext/bulkload/transform.py, или последнюю версию файла из репозитория: здесь.

person waffle paradox    schedule 27.07.2011

Небольшой момент - вы можете использовать приведенный ниже оператор вместо этого, если ваш "my_transforms.transform_integer"

import_transform: 'lambda x: int(x)'
person java4africa    schedule 23.08.2011