Модель экспорта загрузчика AppEngine с самоопределенным свойством - PullRequest
2 голосов
/ 08 октября 2011

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

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

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

1 Ответ

1 голос
/ 31 января 2012

Хорошо, я отвечаю на свои вопросы ...

Я до сих пор не знаю, почему pickle не работает, но после перехода на использование simplejson вместо pickle, яможет успешно экспортировать MyProperty в указанном формате.

Bulletader.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
...