Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Операция в Django
Операция (Operation) в Django — это фундаментальный объект системы миграций базы данных. Операция представляет собой атомарное изменение схемы БД, такое как создание таблицы, добавление колонки или изменение индекса. Каждая миграция состоит из последовательности операций.
Основные концепции
Операции в Django используются в системе миграций для описания изменений схемы БД. Они работают как в прямом направлении (forward) для применения миграции, так и в обратном (backward) для отката.
Главные классы операций в django.db.migrations.operations:
from django.db.migrations.operations import (
CreateModel,
DeleteModel,
RenameModel,
AlterField,
RenameField,
RemoveField,
AddField,
AddIndex,
RemoveIndex,
AlterUniqueTogether,
AlterIndexTogether,
RunSQL,
RunPython
)
Наиболее используемые операции
1. CreateModel — создание новой модели:
from django.db import migrations, models
class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True)),
('name', models.CharField(max_length=100)),
('email', models.EmailField(unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
]
2. AddField — добавление колонки:
class Migration(migrations.Migration):
operations = [
migrations.AddField(
model_name='user',
name='phone',
field=models.CharField(max_length=20, null=True, blank=True),
),
]
3. AlterField — изменение параметров колонки:
class Migration(migrations.Migration):
operations = [
migrations.AlterField(
model_name='user',
name='email',
field=models.EmailField(max_length=254, unique=True),
),
]
4. RenameField — переименование колонки:
class Migration(migrations.Migration):
operations = [
migrations.RenameField(
model_name='user',
old_name='phone_number',
new_name='phone',
),
]
5. RemoveField — удаление колонки:
class Migration(migrations.Migration):
operations = [
migrations.RemoveField(
model_name='user',
name='legacy_field',
),
]
6. DeleteModel — удаление модели:
class Migration(migrations.Migration):
operations = [
migrations.DeleteModel(
name='LegacyModel',
),
]
Расширенные операции
RunSQL — выполнение сырого SQL:
class Migration(migrations.Migration):
operations = [
migrations.RunSQL(
sql="CREATE INDEX idx_email ON users(email);",
reverse_sql="DROP INDEX idx_email;"
),
]
RunPython — выполнение Python кода:
def populate_data(apps, schema_editor):
User = apps.get_model('myapp', 'User')
User.objects.create(name='Admin', email='admin@example.com')
def unpopulate_data(apps, schema_editor):
User = apps.get_model('myapp', 'User')
User.objects.filter(name='Admin').delete()
class Migration(migrations.Migration):
operations = [
migrations.RunPython(
populate_data,
reverse_code=unpopulate_data
),
]
Работа с индексами
AddIndex — добавление индекса:
from django.db.models import Index, Q
class Migration(migrations.Migration):
operations = [
migrations.AddIndex(
model_name='user',
index=Index(
fields=['email', 'created_at'],
name='idx_user_email_created',
),
),
]
RemoveIndex — удаление индекса:
class Migration(migrations.Migration):
operations = [
migrations.RemoveIndex(
model_name='user',
name='idx_user_email_created',
),
]
Комплексный пример миграции
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
# 1. Добавляем новое поле
migrations.AddField(
model_name='user',
name='profile',
field=models.OneToOneField(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to='myapp.UserProfile'
),
),
# 2. Переименовываем поле
migrations.RenameField(
model_name='user',
old_name='date_joined',
new_name='created_at',
),
# 3. Добавляем индекс
migrations.AddIndex(
model_name='user',
index=models.Index(fields=['email'], name='idx_user_email'),
),
# 4. Выполняем миграцию данных
migrations.RunPython(
code=lambda apps, schema_editor: None,
reverse_code=lambda apps, schema_editor: None,
),
]
Важные принципы работы с операциями
1. Атомарность — каждая операция независима:
# Правильно: каждая операция отдельно
migrations.AddField(...),
migrations.AlterField(...),
migrations.RemoveField(...),
2. Зависимости между миграциями:
class Migration(migrations.Migration):
# Эта миграция зависит от предыдущей
dependencies = [
('myapp', '0001_initial'),
]
operations = [...]
3. Обратимость для отката:
# RunSQL с обратным SQL для отката
migrations.RunSQL(
sql="ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL;",
reverse_sql="ALTER TABLE users DROP COLUMN deleted_at;"
)
Заключение
Операции в Django — это строительные блоки системы миграций. Они позволяют версионировать и отслеживать изменения схемы БД, обеспечивая безопасное развитие приложения. Понимание различных типов операций критично для эффективной работы с Django миграциями и управления схемой базы данных в production среде.