AppEngine bulkloader导出具有自定义属性的模型

时间:2011-10-08 14:12:00

标签: python google-app-engine bulkloader

我想使用 bulkloader 下载模型中包含某些自定义属性的所有实体。

如果我定义这样的模型,

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()

那么如何使用bulkloader下载MyModel,以便文件中没有未被腌制的值?我想我应该在bulkloader.yaml中为export_transform定义info,但我不知道应该是什么样的。

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,但仍然不知道它是如何运作的。请告诉我任何可以解决我的问题的方法。感谢。

1 个答案:

答案 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