← Назад к вопросам

Что такое операция в Django?

2.3 Middle🔥 181 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Операция в 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 среде.

Что такое операция в Django? | PrepBro