Предоставление начальных данных для моделей через fixtures (обновил)

категория: Django
Это иногда очень полезно предварительно наполнить вашу базу данных информацией, когда вы разворачиваете впервые ваше приложение. Есть несколько способов с помощью Django автоматически создать эти данные: можете предоставить исходные данные через фикстуры (fixtures), или можете использовать SQL. Кому как угодно — но я буду рассматривать первый метод. Фикстура — это коллекция данных, которые Django знает как импортировать в базу данных. Наиболее простой путь создания фикстуры, когда уже есть какие-то данные в базе — это просто введение команды:
python manage.py dumpdata
Можно конечно же написать фикстуру вручную в формате JSON, XML, YAML. К примеру фикстура модели “Writer” в формате JSON:
[
	{
		“model”: “blog.writer”,
		“pk”: 1,
		“fields”: {
			“first_name”: “Alexander”,
			“last_name”: “Pushkin”
		}
	},
	{
		“model”: “blog.writer”,
		“pk”: 2,
		“fields”: {
			“first_name”: “Lev”,
			“last_name”: “Tolstoi”
		}
	}
]
Тоже самое только в формате YAML:
- model: blog.writer
	pk: 1
	fields: 
		first_name: Alexander
		last_name: Pushkin
- model: blog.writer
	pk: 2
	fields:
		first_name: Lev
		last_name: Tolstoi
Загрузка данных не имеет ничего сложного — просто введите в терминале:
python manage.py loaddata fixturename.json
Каждый раз когда запускается loaddata, данные будут читаться из фикстуры и перегружаться в базу. Но нужно не забывать, что при повторном запуске данные будут перезаписываться. Автоматическая загрузка начальных данных из фикстур Если вы создаете фикстуру названную initial_data.[xml/yaml/json], то фикстура будет загружаться каждый раз, когда будет вводиться команда syncdb. И опять нужно не забывать, что при каждом запуске syncdb данные будут перезаписываться. Не используйте initial_data для данных, которые вы хотите редактировать. Где Django ищет файлы фикстур По умолчанию Django ищет директорию фикстур в каждом приложении. Вы можете установить пути в FIXTURE_DIRS в settings.py, где Django должен искать. Запуская manage.py loaddata, вы можете также указывать абсолютный путь к файлу фикстуры, который перепишет поиск в стандартных директориях. Подробнее читайте в https://docs.djangoproject.com/en/dev/howto/initial-data/#providing-initial-data-with-fixtures. --- Решил обновить, уже не раз стыкался с фикстурами, dumpdata по умолчанию записывает все в одну строку. Это очень не удобно визуально и если нужно что-то поменять, да и IDE жутко тупить начинает. Поэтому советую создавать подобным образом, чтоб все разделялось 4-мя пробелами и записываем в файл data.json, который уже в дальнейшем будете юзать:
python manage.py dumpdata --indent 4 > data.json
А чтоб избежать всяких ошибок и проблем, если на локальном сервере любите использовать SQLite, то так:
python manage.py dumpdata --natural --exclude auth.permission 
--exclude contenttypes --indent 4


blog comments powered by Disqus