Модель экспорта массового загрузчика AppEngine с самоопределяемым свойством

Я хочу использовать массовый загрузчик для загрузки всех объектов в модели с некоторым самоопределяемым свойством.

Если я определяю такую ​​модель,

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 с помощью массового загрузчика, чтобы в файле не было необработанного значения? Я думаю, что я должен определить export_transform для info в bulkloader.yaml, но я не знаю, как это должно быть.

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, но понятия не имею, как это работает. Пожалуйста, сообщите мне любой метод, который может решить мою проблему. Спасибо.


person Yi H.    schedule 08.10.2011    source источник
comment
Что вы имеете в виду под тем, что в файле не будет необработанного значения? Вы не хотите, чтобы это поле отображалось, или вы хотите, чтобы оно там было замариновано, или что-то еще?   -  person Nick Johnson    schedule 10.10.2011
comment
Я хочу сказать, что я хочу, чтобы это поле отображалось в CSV, но я хочу, чтобы оно было распаковано перед записью в CSV. В настоящее время поле будет отображаться в CSV как маринованное значение.   -  person Yi H.    schedule 10.10.2011
comment
Невыбранная строка является объектом. Вы не можете вывести объект в текстовый файл, только его строковое представление. Какое представление вы хотите записать в файл?   -  person Nick Johnson    schedule 11.10.2011
comment
Если использовать приведенный выше пример, я хочу знать, могу ли я записать info.name или info.name,info.id в информацию о поле в файле CSV.   -  person Yi H.    schedule 12.10.2011


Ответы (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
person Yi H.    schedule 31.01.2012