Everything you wanted to know
about the Django framework

Советы по написанию миграции данных в приложении Django

Введение

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

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

Используйте команды управления

Приложения могут регистрировать пользовательские действия с manage.py, создавая файл в каталоге management/commands приложения. Это позволяет легко (повторно) запускать и тестировать миграции данных.

Вот команда управления, которая переносит столбец status модели Task.

from django.core.management.base import BaseCommand
from library.tasks import Task

class Command(BaseCommand):

    def handle(self, *args, **options):
        status_map = {
            'valid': 'ACTIVE',
            'invalid': 'ERROR',
            'unknown': 'UKNOWN',
        }
        tasks = Task.objects.all()
        for tasks in tasks:
            task.status = status_map[task.status]
            task.save()

Если миграция включена в файлы миграции Django напрямую, мы должны откатить и повторно применить всю миграцию, которая становится трудоемкой.

Связывание вместе миграции данных и миграции схемы

Если миграция данных должна выполняться до / после конкретной миграции схемы, включите команду миграции с помощью RunPython в ту же миграцию схемы или создайте отдельный файл миграции схемы и добавьте миграцию схемы в качестве зависимости.

def run_migrate_task_status(apps, schema_editor):
    from library.core.management.commands import migrate_task_status
    cmd = migrate_task_status.Command()
    cmd.handle()


class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.RunPython(run_migrate_task_status, RunSQL.noop),
    ]

Будьте остородны при запросах к БД

При работе с основной функцией, которая включает серию миграций, мы должны быть осторожны с миграциями данных (которые используют ORM), происходящими между миграциями схемы.

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

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

# вместо
User.objects.all ()

# использовать
User.objects.only ('id', 'is_active')

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

Заключение

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

Перевод https://avilpage.com/2019/09/django-tips-data-migrations.html

Поделитесь с другими:

Представления-классы
(Class-Based Views)

Детальное описание и структура классов Django.

Выпуск Django 3.0

Команда Django рада объявить о выпуске Django 3.0: движение к тому, чтобы сделать Django полностью асинхронным, предоставляя поддержку для работы в качестве приложения ASGI, теперь официально поддерживает MariaDB 10.1 и выше, а также много других новых функций и возможностей.

Выпущены релизы безопасности Django: 2.2.8 и 2.1.15

В соответствии с политикой безопасности, команда Django выпускает Django 2.2.8 и Django 2.1.15. Этот выпуск решает проблему безопасности, подробно описанную ниже. Мы призываем всех пользователей Django обновиться как можно скорее.

Путь от request до response в Джанго

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

Выпущен релиз-кандидат Django 3.0

Кандидат 1 релиза Django 3.0 - это последняя возможность для вас испытать множество новых функций перед выпуском Django 3.0.

Django DetailView - основы использования

Django позволяет создавать приложения очень легко. Если приложение должно быть выпущено быстро и является относительно общим, то эта среда Python идеально подходит для этого. В течение нескольких лет я профессионально работал в этой среде и часто рылся внутри, поэтому знаю почти всё, и сегодня я представлю вам все, что нужно знать, чтобы эффективно использовать универсальный DetailView в Django.

Выпущены исправления Django: 2.2.7, 2.1.14 и 1.11.26

Сегодня команда разработчиков Django выпустила версии 2.2.7, 2.1.14 и 1.11.26 с исправлениями ошибок. Пакет и контрольные суммы доступны на странице загрузок, а также из индекса пакетов Python. Идентификатор ключа PGP, использованный в этом выпуске: Mariusz Felisiak: 2EF56372BA48CD1B.

Как заставить request.is_ajax() работать с JS fetch()

Объект запроса Django request имеет изящный небольшой метод is_ajax(). Он позволяет определить, поступил ли запрос от JS-фреймворка (он же ajax старой школы). Хотя он отлично работает с некоторыми библиотеками JS, включая почтенный jQuery, он не будет работать с современным встроенным в JS fetch().

Практика программирования на Python 3, лекция №5

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №5.

Практика программирования на Python 3, лекция №4

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №4.

Практика программирования на Python 3, лекция №3

Лекции о Python 3 от Тимофея Хирьянова при поддержке Московского физико-технического института. Лекция №3.