📜  Django 迁移 | Python(1)

📅  最后修改于: 2023-12-03 15:00:27.518000             🧑  作者: Mango

Django 迁移

简介

Django迁移是一种数据库迁移解决方案,用于在开发过程中更改模型并自动更新数据库。它允许您在保留您的数据的同时,更改您的应用程序的模型。

使用方法

首先,在 Django settings 中启用迁移

INSTALLED_APPS = [
    ...
    'django.contrib.contenttypes',
    'django.contrib.auth',
    'myapp',
    ...
]

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    ...
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

其次,创建一个模型。比如说,我们创建一个叫做 Author 的模型:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()

然后,用以下命令新建一个迁移:

python manage.py makemigrations

接着,执行迁移:

python manage.py migrate

这样,新创建的模型就会被迁移到数据库中。

迁移类

每个迁移都由一个迁移类来表示,该类继承自 django.db.migrations.Migration 类。它包含以下属性:

dependencies
dependencies = [
    ('myapp', '0001_initial'),
]

这个属性规定了迁移的依赖关系。

operations
operations = [
    migrations.CreateModel(
        name='Author',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ('name', models.CharField(max_length=100)),
            ('age', models.IntegerField()),
        ],
    ),
]

这个属性规定了对数据库操作的列表。

数据迁移

假设您已经从 Author 模型中删除了 age 字段,并将其添加到了新的 Birthday 模型中。

class Birthday(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    date = models.DateField()

现在我们需要使用数据库迁移来更新数据库。

首先,更新 Author 模型

class Author(models.Model):
    name = models.CharField(max_length=100)

紧接着,我们用以下命令创建一个迁移

python manage.py makemigrations

我们得到了以下迁移:

from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RemoveField(
            model_name='author',
            name='age',
        ),
        migrations.CreateModel(
            name='Birthday',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('date', models.DateField()),
                ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myapp.author')),
            ],
        ),
    ]

最后,执行迁移:

python manage.py migrate

现在,数据库已经被更新,每一个 Author 对象现在都有一个 Birthday 对象与之关联。

总结

Django 迁移是一个很有用的工具,可以让你在开发过程中更改模型并自动更新数据库。迁移类可以帮助我们管理不同版本的迁移,从而确保版本控制的一致性。我们必须经常使用迁移,以确保数据库模型的完整性。