Пакет для импорта данных в Django

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

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

Предыстория

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

Некоторой проблемой для меня оказалось то, что я так до конца и не смог понять, как этим пользоваться. Мне было нужно получить импорт данных в любую из моделей, которых у нас было на тот момент, примерно 40. Из описания, доступного на тот момент я понял, что это кажется, можно сделать. Однако громоздкость набора использованных фреймворков и необходимость регистрации сериализаторов для каждой из моделей меня напрягли настолько, что я стал искать замену.

Надо было разобраться

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

Пакет Django Import Export хорош всем, кроме одного. Он требует жестко определенного описания "ресурса" прямо в коде, что не позволяет импортировать произвольно отформатированный файл.

Еще один пакет почему-то не оказался в специализированном гриде, но ищется поиском. Это Django CSV Import. Он понравился мне своим скупым дизайном и простотой использования, но отсутствие кастомизации импорта и передачи процедуры импорта в асинхронное исполнение через Celery потребовало вмешательства в код. Через некоторое время, проведенное в попытке такого вмешательства, я понял, что мне проще будет написать все с нуля, чем разбираться в зависимостях, которые образовались из за длительной истории этого пакета.

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

Процедура импорта

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

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

Сама процедура импорта выполняется либо сразу в момент сохранения задания, либо после сохранения объекта описания задания, в узле Celery. Последнее требует добавления одной строки в настройках, ну и конечно, запуска собственно самого узла.

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

Кастомизация импорта полей

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

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

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

Пользуйтесь!

Пакет имеет открытый код, размещен на GitHub и распространяется под лицензией LGPL. Его можно использовать непосредственно в своем проекте, расширяя своими разновидностями отображений по необходимости. Если у вас есть исправления, вы можете ответвиться и предложить ваши изменения. Если готовых изменений нет, можно написать Issue, где описать вашу проблему или идею.

Источник: https://habr.com/ru/post/718122/


Интересные статьи

Интересные статьи

Как спарсить исторические данные 2017-2021 годов с Google Scholar и сохранить их в CSV, SQLite используя Python и SerpApi.
Сегодня хочу рассказать об одном случае из жизни, когда невинная ошибка при написании скрипта командной оболочки привела к удалению базы данных, используемой в продакшне. Расскажу я и о т...
Автоматизация сопровождает нас повсюду и является спутником и признаком прогресса, снимая с человека необходимость выполнения рутинных действий и принятия рутинных решений. Но для при...
Большинство IT профессионалов видели бизнес-процессы, в которых пользователям приходилось включать документы, такие как счета-фактуры, в одну систему, а затем повторно вв...
Визуализация многомерных данных очень полезна для выявления их важных закономерностей и свойств. Для этой цели используются алгоритмы снижения размерности. Среди наиболее распространенных алгорит...