3

つまり、参照付きの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てみると果物がアップロードされていますが、重複がたくさんあります。

私は人を果物にリンクしようとしていますが、果物は重複していません-これはバルクローダーを介して可能ですか?

4

3 に答える 3

4

もちろん。

基本的な問題は、ステップが欠落していることです。あなたは果物の名前を持っています、あなたが参照を保存したいのは果物の鍵です。これはいくつかの方法で実現できます。

Bananaまたはが果物の永続的な一意の識別子である場合Appleは、を使用できますtransform.create_foreign_key('Fruit')。これにより、フルーツ名がキー名であるフルーツキーが得られます。存在しない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()

   entity_instanceを返します

秘訣は、input_dictを使用してルックアップを実行することです。ポリモデルを使用している場合、ウィザードから自動生成された「種類」を使用することはできません。ここのサンプルコードのmodel.modelNameを使用する必要があります。

于 2011-08-18T21:35:49.697 に答える
0

これをきれいに行う方法がわからなかったため、データを複数のファイルに分割し、IDを事前に生成することになりました。

于 2011-05-16T14:47:09.890 に答える