Рубрики
Без рубрики

Как манипулировать данными с миграциями Django

Автор оригинала: Victoria Drake.

В этой статье мы узнаем, как обновить модели Django и манипулировать существующими данными, использующими миграцию.

Успешные приложения, которые растут, – это прекрасная проблема. В качестве продукта разрабатывается, он имеет тенденцию накапливать осложнение, как ваш проект пирога на выходных накапливает слои глазури.

К счастью, Django, мои любимые батареи, включенные в стоимость, обрабатывают сложность довольно хорошо.

Джанго Модели помогают людям работать с данными таким образом, чтобы иметь смысл нашему мозгу Отказ И рамка предлагает множество классов, которые вы можете наследовать, чтобы помочь вам быстро развивать надежное приложение с нуля.

Что касается разработки на существующих приложениях Django, также есть функция для этого тоже.

В этой статье мы осмотрим, как использовать миграции Django для обновления существующих моделей и базы данных.

Что под капотом

Migrations Django – это файлы Python, которые помогают вам добавлять и изменить вещи в таблицах базы данных, чтобы отразить изменения в ваших моделях Django.

Чтобы понять, как миграции Django помогут вам работать с данными, может быть полезно понять основные структуры, с которыми мы работаем.

Что такое таблица базы данных?

Если вы заложили глаза на электронную таблицу, вы уже большую часть способа понять таблицу базы данных.

В реляционной базе данных, например, база данных PostgreSQL, вы можете ожидать, чтобы данные, организованные в столбцы и строки. Таблица реляционной базы данных может иметь множество столбцов и любое количество строк.

В Джанго каждая модель – это собственная таблица. Например, вот модель Django:

from django.db import models


class Lunch(models.Model):
    left_side = models.CharField(max_length=100, null=True)
    center = models.CharField(max_length=100, null=True)
    right_side = models.CharField(max_length=100, null=True)

Каждое поле является столбцом, и каждая строка представляет собой экземпляр объекта Django этой модели.

Вот представление таблицы базы данных для модели Django «обед» выше. В базе данных его название было бы Обед_Табельный Отказ

1 Пластина Вилка Ложка

Модель Обед имеет три поля: left_side , Центр и правая сторона Отказ Один экземпляр A Обед Объект будет иметь «вилку» для left_side , «тарелка» для Центр и “ложка” для right_side Отказ

Джанго автоматически добавляет ID поле Если вы не укажете основной ключ.

Если вы хотели изменить имя вашей обедной модели, вы сделаете это в вашем Models.py код.

Например, измените «обед» на «ужин», затем Беги Python Manage.py Makemigrations Отказ Вот увидишь:

python manage.py makemigrations
Did you rename the backend.Lunch model to Dinner? [y/N] y
Migrations for 'backend':
  backend/migrations/0003_auto_20200922_2331.py
    - Rename model Lunch to Dinner

Django автоматически генерирует соответствующие файлы миграции. Соответствующая линия сгенерированных миграционных файлов в этом случае будет выглядеть:

migrations.RenameModel(old_name="Lunch", new_name="Dinner"),

Эта операция переименовала бы наш «обед» модель «ужин», сохраняя все остальное одинаково.

Но что, если вы также хотели изменить структуру самой таблицы базы данных, его схема, а также убедитесь, что существующие данные заканчиваются в нужном месте на вашем обеденном столе?

Давайте исследуем, как превратить нашу обеденную модель в модель обеда, которая выглядит так:

from django.db import models


class Dinner(models.Model):
    top_left = models.CharField(max_length=100, null=True)
    top_center = models.CharField(max_length=100, null=True)
    top_right = models.CharField(max_length=100, null=True)
    bottom_left = models.CharField(max_length=100, null=True)
    bottom_center = models.CharField(max_length=100, null=True)
    bottom_right = models.CharField(max_length=100, null=True)

… с таблицей базы данных, которая выглядела так:

1 Хлебная пластина Стекло Ложка Вилка Нож Пластина

Как манипулировать данными с миграциями Django

Прежде чем начать манипулировать своими данными, всегда хорошая идея создать резервную копию вашей базы данных, которую вы можете восстановить в случае, если что-то пойдет не так.

Существуют различные способы сделать это в зависимости от базы данных, которую вы используете. Как правило, вы можете найти инструкции, поиск <Имя базы данных> и ключевые слова, такие как Резервное копирование , Восстановление или Снимок Отказ

Для того, чтобы разработать свою миграцию, полезно познакомиться с доступным Миграционные операции Отказ

Миграция запускаются пошаговые, и каждая операция – это какой-то вкус добавления, удаления или изменений данных. Как и стратегическая головоломка, важно сделать модель изменять один шаг за раз, так что сгенерированные миграции имеют правильный результат.

Мы уже успешно переименовали нашу модель. Теперь мы переименуем поля, которые удерживают данные, которые мы хотим сохранить:

class Dinner(models.Model):
    bottom_left = models.CharField(max_length=100, null=True)
    bottom_center = models.CharField(max_length=100, null=True)
    top_center = models.CharField(max_length=100, null=True)

Django иногда достаточно умны, чтобы правильно определить старые и новые имена полей. Вас будет просить подтверждения:

python manage.py makemigrations
Did you rename dinner.center to dinner.bottom_center (a CharField)? [y/N] y
Did you rename dinner.left_side to dinner.bottom_left (a CharField)? [y/N] y
Did you rename dinner.right_side to dinner.top_center (a CharField)? [y/N] y
Migrations for 'backend':
  backend/migrations/0004_auto_20200914_2345.py
    - Rename field center on dinner to bottom_center
    - Rename field left_side on dinner to bottom_left
    - Rename field right_side on dinner to top_center

В некоторых случаях вы захотите попробовать переименовать поле и запустить Макемиграция один за раз.

Теперь, когда существующие поля были мигрированы на их новые имена, добавьте оставшиеся поля в модель:

class Dinner(models.Model):
    top_left = models.CharField(max_length=100, null=True)
    top_center = models.CharField(max_length=100, null=True)
    top_right = models.CharField(max_length=100, null=True)
    bottom_left = models.CharField(max_length=100, null=True)
    bottom_center = models.CharField(max_length=100, null=True)
    bottom_right = models.CharField(max_length=100, null=True)

Бег Макемиграция Снова теперь дает нам:

python manage.py makemigrations
Migrations for 'backend':
  backend/migrations/0005_auto_20200914_2351.py
    - Add field bottom_right to dinner
    - Add field top_left to dinner
    - Add field top_right to dinner

Вы закончили! Создавая миграции Django, вы успешно настроили свой Dinning_table и переместил существующие данные на новое место.

Дополнительная сложность

Вы заметите, что наш обеденный и ужин не очень сложен. Из Джанго много Варианты поля модели мы просто используем Шарфилд Отказ Мы также устанавливаем null = true Пусть Django хранит пустые значения как Null в базе данных.

Миграции Django могут обрабатывать дополнительную сложность, такую как изменение типов поля, и разрешено ли пустое или нулевое значение. Я держу Django Модель поле эталона Удобный, насколько я работаю с различными типами данных и различными случаями использования.

Де-мистифицированные миграции

Я надеюсь, что эта статья помогла вам лучше понять миграции Django и как они работают!

Теперь, когда вы можете изменить модели и манипулировать существующими данными в вашем приложении Django, обязательно используйте свои полномочия.

Резервное копирование вашей базы данных, исследование и планирование миграций и всегда запускаем тесты, прежде чем работать с данными клиентов. При этом у вас есть потенциал, чтобы позволить вашему приложению расти – с управляемыми уровнями сложности.