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

В настоящее время у меня есть 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?

Ответы [ 3 ]

3 голосов
/ 28 июля 2011

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

Я добавил еще один столбец в мой 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
1 голос
/ 23 августа 2011

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

import_transform: 'lambda x: int(x)'
1 голос
/ 28 июля 2011

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

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

...