Skip to main content
 首页 » 编程设计

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

2025年05月04日23mfryf

我想使用 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() 

那么我如何使用批量加载器下载 MyModel,这样文件中就不会有未腌制的值?我想我应该在 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但仍然不知道它是如何工作的。请告诉我任何可以解决我的问题的方法。谢谢。

请您参考如下方法:

好吧,我正在回答我自己的问题......

我仍然不知道为什么 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