父节点驻留在数据存储中,分配使用CSV bulloader上传的子节点



目前我有一个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 s进入数据存储时,它们的parent属性被分配给team ?

第一个答案缺乏细节,但我能从中收集到一些信息。

我添加了另一列到我的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

父信息存储在键中,因此您将设置__key__属性。

为了创建一个多级键,您需要使用google.appengine.ext.bulkload.transform.create_deep_key,它将path_info作为参数并返回一个转换方法,该方法将当前字典解析为具有path_info中指定的父键的key。要了解更多信息,请阅读实际方法中的文档字符串,可以在APPENGINE_ROOT/google/appengine/ext/bulkload/transform.py中找到,或者在这里找到repo中文件的最新版本。

如果你的"my_transforms.transform_integer"

你可以使用下面的语句
import_transform: 'lambda x: int(x)'

最新更新