具有自定义属性的AppEngine bulkloader导出模型 [英] AppEngine bulkloader export Model with self-defined Property

查看:107
本文介绍了具有自定义属性的AppEngine bulkloader导出模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 bulkloader 通过一些自定义Property 下载模型中的所有实体。

如果我定义了这样的模型,

  class MyType:
def __init __(self,arg):
self.name = arg ['name']
self.id = arg ['id']
$ b $ class MyProperty(db.Property):
def get_value_for_datastore(self ,实例):
val = super(MyProperty,self).get_value_for_datastore(instance)
如果type(val)== dict:
val = MyType(val)
return pickle (val)
$ b $ def make_value_from_datastore(self,val):
返回None如果val是None else pickle.loads(str(val))

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

然后我该如何下载 MyModel 使用批量加载程序,使得文件中不会有未被清理的值?我想我应该为bulkloader.yaml中的 info 定义 export_transform ,但我不知道它应该是什么

 变形金刚:
- kind:MyModel
连接符:csv
property_map:
- property:__key__
external_name:log_id
export_transform:transform.key_id_or_name_as_string
- property:info $ b $ external_name:info
export_transform:### HERE ## #

我见过 transform.py ,但仍然不知道它是如何工作的。请告诉我可以解决我的问题的任何方法。谢谢。

解决方案

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



我仍然不知道为什么 pickle 不起作用,但改成使用 simplejson 而不是 pickle ,我可以用指定的格式成功导出 MyProperty



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

变形金刚:
- kind:MyModel
连接器:csv
property_map:
.. 。
- property:info
external_name:info
export_transform:myutils.load_info

并且在myutils.py load_info 中可能看起来像这样。

  def load_info():
def load(x):
如果不是x:
return''
info = simplejson.loads(x)
return' %s-%s'%(in fo ['id'],info ['name'])#info的输出格式
返回加载


I want to use bulkloader to download all entities in a model with some self-defined Property.

If I define a model like this,

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

then how can I download MyModel using the bulkloader such that there will not be un-pickled value in the file? I think I should define the export_transform for info in bulkloader.yaml, but I don't know what it should be like.

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 ###

I've seen transform.py but still have no idea about how it works. Please tell my any method that can solve my problem. Thanks.

解决方案

Okay I'm answering my own questions...

I still don't know why pickle doesn't work, but after changing to use simplejson instead of pickle, I can successfully export MyProperty in the designated format.

The bulkloader.yaml may look like this.

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

And in myutils.py load_info may look like this.

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

这篇关于具有自定义属性的AppEngine bulkloader导出模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆