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