Заполнение Django данными по умолчанию

Допустим, у нас есть какое-то свойство, какого-то класса, которое мы хотим заполнять начальными значениями при развертывании 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 на сервере или на тестовой машине, данные будут добавлены в БД после создания структуры таблиц.

 

 

Тэги: