Допустим, у нас есть какое-то свойство, какого-то класса, которое мы хотим заполнять начальными значениями при развертывании Django с нуля на сервере или другой девелоперской машине.
Сегодня, например, у меня это ClientTypes модуля user_profile:
Я допускаю, что администратор со временем добавит какие-то виды клиентов, например «тестовый клиент», но все же хочу, чтобы при создании базы автоматически создавались типы клиентов «покупатель», «продавец», «покупатель и продавец». Сейчас, если забрать проект из git`а и выполнить миграции, нет ничего.
Что понадобится? Во-первых, давайте создадим свой пустой файл миграции, который будет вызываться среди прочих миграций:
python manage.py makemigrations user_profile –empty
Скрипт отработал, создал новую миграцию, которую мы заставим работать по наполнению данными.
Тут принцип не особо сложный – джанго при миграции вызывает одну миграцию за другой (не обязательно по порядку, там по зависимостям), и выполняет то, что написано в файле.
Давайте в этом файле создадим функцию, которая будет наполнять базу, и попросим Django её вызывать:
# Generated by Django 2.2.5 on 2019-12-28 10:07 # Добавляем models, чтобы Django могло создавать экземпляры нужных нам классов from django.db import migrations, models # Пишем функцию, которая будет вызываться при вызове этого файла миграции # Название функции произвольное, должно принимать два параметра, как тут def client_types(apps, schema_editor): # Типы - наш перечень, который будет вставлен в БД types = ["Покупатель", "Продавец", "Покупатель и продавец"] # Попросим Django вытащить модель - класс ClientTypes из аппликейшена user_profile ClientTypes = apps.get_model("user_profile", "ClientTypes") #Теперь в цикле создаём экземпляры класса с указанными параметрами и сохраняем их for t in types: cl_type = ClientTypes(client_type=t) cl_type.save() class Migration(migrations.Migration):
Реклама:
dependencies = [ ('user_profile', '0010_auto_20191105_1643'), ] # Тут вызываем встроенный метод RunPython и указываем, какую функцию вызвать при миграции (нашу) operations = [ migrations.RunPython(client_types), ]
Написали, сохранили, теперь нужно её применить:
Заходим в админку, смотрим – данные появились
Теперь, когда будете раскатывать новый экземпляр Django на сервере или на тестовой машине, данные будут добавлены в БД после создания структуры таблиц.