Appengine Bulkloader с джанго-нонрелом

Я хочу использовать appengine bulkloader с моим проектом django-nonrel, как предложено в http://thomas.broxrost.com/category/google-app-engine/ и в http://blog.suinova.com/2009/03/tutorial-on-bulkloading-data-onto-app.html. Но это дает ошибку: нет модуля с именем google.appengine.ext.webapp. Я думаю, что это из-за Django-nonrel, я не могу получить доступ к Google Webapp. Исправьте меня, если я ошибаюсь. Кроме того, кажется, что мои поля модели также отличаются, как поддерживается Google Bulloader. Дайте мне знать, если кто-нибудь знает любую другую альтернативу. Любые онлайн документы или указатели приветствуются:-)

1 ответ

Только что увидел твой пост. Я могу нормально использовать загрузчик appengine с моим проектом django-nonrel.

Есть пара вещей, на которые стоит обратить внимание:

  • В моделях, которые мне необходимо загрузить, у меня первичные ключи установлены вручную, поместив "primary_key=True" в поле, которое я хочу использовать в качестве первичного ключа. Это заставляет Django создавать модель с именем ключа вашего поля первичного ключа, и вы можете быть уверены, что модели, которые вы создаете, будут иметь известные первичные ключи. (вместо того, чтобы позволить автоматическим полям pk взять на себя управление, а затем pk - это случайное поле идентификатора appengine)

  • в вашем файле bulkloader.yaml укажите поля свойства внешнего ключа с помощью 'field_id'. Способ, которым django создает схему db, заключается в том, что поля внешнего ключа на самом деле хранятся с прикрепленным "_id". Не пытайтесь использовать import_transform и export_transform, чтобы превратить ваше поле в "ключевое" поле приложения...

Вот пример того, что у меня сейчас работает.

class Team(models.Model):
    appengine_key = models.CharField(max_length=100, primary_key=True)
    abbr = models.CharField(max_length=3)
    name = models.CharField(max_length=10)
    division = models.ForeignKey(Division, related_name="teams")
    is_active = models.BooleanField(default=True)
    created_time = models.DateTimeField(auto_now_add=True)
    updated_time = models.DateTimeField(auto_now=True)

Моя декларация bulkloader.yaml для этого поля выглядит следующим образом:

python_preamble:
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.db
- import: re
- import: base64
- import: datetime

transformers:
- kind: app_team
  connector: csv
  connector_options:
    encoding: utf-8
    columns: from_header

  property_map:
    - property: __key__
      external_name: appengine_key
      export_transform: transform.key_id_or_name_as_string

    - property: abbr
      external_name: abbr

    - property: name
      external_name: name

    - property: division_id
      external_name: division

    - property: is_active
      external_name: is_active
      import_transform: transform.none_if_empty(bool)

    - property: created_time
      external_name: created_time
      import_transform: transform.import_date_time('%m/%d/%Y %H:%M:%S')
      export_transform: transform.export_date_time('%m/%d/%Y %H:%M:%S')

    - property: updated_time
      external_name: updated_time
      import_transform: transform.import_date_time('%m/%d/%Y %H:%M:%S')
      export_transform: transform.export_date_time('%m/%d/%Y %H:%M:%S')

Затем ваш CSV-файл должен иметь заголовки полей, как вы указали в объявлении 'external_name', и соответствующие данные для массовой загрузки!

Вы можете убедиться, что он работает в вашей локальной среде, запустив что-то похожее на следующее, пока работает ваш локальный сервер выполнения:

python2.5 /usr/local/bin/appcfg upload_data --config_file=app/bulkloader.yaml --filename=app/fixtures/teams.csv --kind=app_team --url=http://localhost:8080/_ah/remote_api app
Другие вопросы по тегам