Экспорт и импорт данных в Django

21 июня 2018 г. 9:52

Быстрый способ передать данные - воспользоваться встроенными средствами Django: dumpdata и loaddata.

./manage.py dumpdata
выведет все данные приложений из INSTALLED APPS.
./manage.py loaddata db.json
загрузит фикстуры (дамп базы данных).

Иногда может потребоваться наполнить базу данными при первоначальном сетапе приложения. Данные могут быть предоставлены в миграциях или фикстурах.

Фикстуры

Во-первых, укажем в настройках директорию (по умолчанию Джанго ищет фикстуры в папке fixtures внутри приложения):
FIXTURE_DIRS = (
'path/app/my_fixtures/',
)
Сделаем дамп базы командой
./manage.py dumpdata
Очистим таблицы и применим миграции
./manage.py flush myapp
./manage.py migrate
Фикстуры могут быть сжаты в формат zip, gz, или bz2. Все фикстуры проекта, как и шаблоны, находятся в одном пространстве имен. Поэтому нужно убедиться, что другие приложения не используют фикстуры с таким же именем. Для этого рекомендуется разместить фикстуры в поддиректориях с именем приложения (как и в случае с html шаблонами). Также можно использовать имя приложения как префикс в имени файла.

Миграции данных

Можно использовать миграции не только для изменения в схеме, но и для изменения в данных. Лучше всего сделать их отдельными миграциями. И хоть Джанго не может сгенерировать их автоматически, совсем не сложно их написать.
Для начала создадим пустую миграцию:
python manage.py makemigrations --empty appname
Джанго сгенерирует файл, который будет выглядеит примерно так:
# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations

class Migration(migrations.Migration):

dependencies = [
('yourappname', '0001_initial'),
]

operations = [
]

Добавим в файл новую функцию и вызовем ее через RunPython. При запуске миграций Джанго работает с историческими версиями моделей, сохрененными в файлах миграций. Если код написан с использованием RunPython, он будет выполнен в историческом контексте. RunPython принимает в качестве аргумента функцию, которая, в свою очередь, принимает 2 аргумента: django.apps.registry.Apps (реестр приложений) и SchemaEditor.
from django.db import migrations

def combine_names(apps, schema_editor):
# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model('yourappname', 'Person')
for person in Person.objects.all():
person.name = '%s %s' % (person.first_name, person.last_name)
person.save()

class Migration(migrations.Migration):

dependencies = [
('yourappname', '0001_initial'),
]

operations = [
migrations.RunPython(combine_names),
]

После того, как это будет сделано, запустм
python manage.py migrate
чтобы применить миграцию

x Удалить пост "Экспорт и импорт данных в Django"?