Экспорт и импорт данных в 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Фикстуры могут быть сжаты в формат zip, gz, или bz2. Все фикстуры проекта, как и шаблоны, находятся в одном пространстве имен. Поэтому нужно убедиться, что другие приложения не используют фикстуры с таким же именем. Для этого рекомендуется разместить фикстуры в поддиректориях с именем приложения (как и в случае с html шаблонами). Также можно использовать имя приложения как префикс в имени файла.
./manage.py migrate
Миграции данных
Можно использовать миграции не только для изменения в схеме, но и для изменения в данных. Лучше всего сделать их отдельными миграциями. И хоть Джанго не может сгенерировать их автоматически, совсем не сложно их написать.Для начала создадим пустую миграцию:
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"?