目前我有一个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)'