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