3

简而言之:如何配置 bulkloader 以将数据插入到 2 个带有引用的模型中?

我有一个人和水果类,人与水果相关联:

class Fruit(db.Model): 
    name = db.StringProperty()
class Person(db.Model): 
    name = db.StringProperty() 
    customer = db.ReferenceProperty(Fruit)

我想上传这个 CSV 数据:

Name,Fruit
Bob,Banana
Joe,Apple
Tim,Banana

我尝试在文档中使用 create_foreign_key :

transformers:

- kind: fruit
  connector: csv
  property_map:
    - property: fruit
      external_name: Fruit

- kind: person
  connector: csv
  connector_options:
    encoding: utf-8
    columns: from_header
  property_map:
    - property: title
      external_name: Name
    - property: fruit
      external_name: Fruit
      import_transform: transform.create_foreign_key('fruit')

当我运行命令时:

appcfg.py upload_data --config_file=bulkloader.yaml --filename=food.csv --kind=person .

这些人被上传并且他们有水果的外键,但他们指向的水果实体不存在。

当我尝试--kind=fruit上传水果时,但有很多重复。

我正在尝试将人与水果联系起来,没有重复的水果 - 这可以通过bulkloader吗?

4

3 回答 3

4

当然。

基本问题是缺少一个步骤。你有一个水果名称,你想要存储一个水果键的引用。您可以通过几种方式完成此操作。

如果BananaApple是水果的永久唯一标识符,则可以使用transform.create_foreign_key('Fruit'). 这将为您提供一个水果键,其中水果名称是键名。将上传指向不存在的水果实体的人员,这很好。只需在属性上使用相同的导入转换上传水果__key__即可创建相应的实体。

如果您不想使用水果名称作为水果键名称,则需要进行一些更复杂的导入后处理。您可以编写一个post_import_function按名称查询水果以查看匹配实体是否已存在,如果不存在则创建一个,然后在新创建的人员实体上设置对它的引用。

于 2011-05-09T13:03:22.080 回答
1

可以使用 post_import_function。

在您的模型中,不要导入外键。相反,添加一个 post_import_function,如下所示:

def fkeyLocation(input_dict, entity_instance, bulkload_state):
   entity_instance.availableAt = Location.all().filter('name = ',input_dict['availableAt']).get().key()

   返回实体实例

诀窍是使用 input_dict 进行查找。如果您使用的是多模型,则不能使用向导中自动生成的“种类”,您必须使用此处示例代码中的 model.modelName 。

于 2011-08-18T21:35:49.697 回答
0

我没有弄清楚如何干净地做到这一点,所以最终只是将我的数据分成多个文件并预生成 ID。

于 2011-05-16T14:47:09.890 回答