2011-10-08 19 views
2

我想用bulkloader下載模型中的所有實體一些自定義屬性AppEngine bulkloader export自定義屬性

如果我這樣定義的模型,

class MyType: 
    def __init__(self, arg): 
     self.name = arg['name'] 
     self.id = arg['id'] 

class MyProperty(db.Property): 
    def get_value_for_datastore(self, instance): 
     val = super(MyProperty, self).get_value_for_datastore(instance) 
     if type(val) == dict: 
      val = MyType(val) 
     return pickle.dumps(val) 

    def make_value_from_datastore(self, val): 
     return None if val is None else pickle.loads(str(val)) 

class MyModel(db.Model): 
    info = MyProperty() 

那我怎麼才能下載MyModel使用bulkloader這樣不會有文件在未醃製的價值呢?我想我應該在bulkloader.yaml中爲info定義export_transform,但我不知道它應該是什麼樣子。

transformers: 
- kind: MyModel 
    connector: csv 
    property_map: 
    - property: __key__ 
    external_name: log_id 
    export_transform: transform.key_id_or_name_as_string 
    - property: info 
    external_name: info 
    export_transform: ### HERE ### 

我見過transform.py但仍然不知道它是如何工作的。請告訴我可以解決我的問題的任何方法。謝謝。

+0

你是什麼意思「這樣在文件中就不會有醃漬的價值」?你不想讓這個領域出現,或者你想讓它在那裏醃製,還是其他什麼? –

+0

我想說的是,我希望該字段顯示在CSV中,但我希望在寫入CSV之前將其取消。目前該字段將以CSV的形式顯示爲醃漬價值。 –

+0

未撥號的字符串是一個對象。您不能將對象輸出到文本文件,只能將其輸出到字符串表示。你想寫什麼表示文件? –

回答

1

好吧,我回答我自己的問題...

我仍然不知道爲什麼pickle不工作,但改變使用simplejson代替pickle後,我可以成功導出MyProperty在指定格式。

bulkloader.yaml可能看起來像這樣。

python_preamable: 
- import myutils 
- import django.utils.simplejson 
... 

transformers: 
- kind: MyModel 
    connector: csv 
    property_map: 
    ... 
    - property: info 
    external_name: info 
    export_transform: myutils.load_info 

而在myutils.py load_info可能看起來像這樣。

def load_info(): 
    def load(x): 
     if not x: 
      return '' 
     info = simplejson.loads(x) 
     return '%s-%s' % (info['id'], info['name']) # the output format for info 
    return load