JawsIk
@JawsIk
ЧПУ-станки(ArtCam, Aspire, Syntec), Python-Django

Как в Django модель сразу добавить много записей из файла?

Имеется очень простая модель:

class Color(models.Model):
    title = models.CharField(max_length=30, verbose_name="Название (код) ЛКМ", unique=True)
    image = ThumbnailerImageField(default='img/thumb.png', resize_source=dict(quality=95, size=(512, 512), sharpen=True))
    priority = models.IntegerField(default=0, verbose_name="Приоритет сортировки")
    is_active = models.BooleanField(default=True)


Есть класс формы:
class ColorForm(forms.ModelForm):
    class Meta:
        model = Color
        fields = ['title', 'image', 'priority', 'is_active']
        labels = {
            'title': 'Название',
            'image': 'Изображение',
            'priority': 'Приоритет сортировки',
            'is_active': 'Активен (включен)',
        }
        help_texts = {
            'priority': 'используется для отображения порядка при выборе, чем больше число, тем выше в списке',
            'is_active': 'если выключен, то не показывается в каталоге',
        }


По началу всё было нормально, но сегодня клиент задаёт вопрос: Мы переходим на коды цвета какого-то каталога, а там около 2500 тысяч цветов. Есть ли возможность всё залить через автомат?
Мол они подготовят *.csv или *.txt файл с кодами, а картинки в принципе не нужны.

И вот вопрос, как лучше всего сделать так, чтобы менеджер могла нажать на кнопку выбрать файл и оно без всяких там "зависонов" заполнило модель нужными значениями. И при этом была так же возможность (как и сейчас) добавлять цвет "по одиночке".

С уважением
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 4
Prognosticator
@Prognosticator
TODO: Здесь будут ворованные умные мысли, типа мои
По началу всё было нормально, но сегодня клиент задаёт вопрос

Тут улыбнулся. Изменение ПО и есть "нормально".

Есть ли возможность всё залить через автомат?

Формулировка задачи тоже веселая.

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

Да и сам вопрос веселый.

Абстрагируюсь и отвечу безотносительно ЯП и веб-фреймворка (т.е не буду писать код за вас - в режиме эремотерия).

Думаю с парсингом файла вы и так разберетесь, напишите воркер (выполняемый в отдельном процессе, "против зависонов") запускаемый по сабмиту формы загрузки файла. В воркере обойдете файл построчно, сохраните извлеченные данные через пакетную (batch) вставку в используемую базу данных (сегодня 2500, завтра вдруг мильоны.). И не суть txt, csv, xlsx, заказчику кстати можно предложить и то и это вместе. Ну и как-то уведомите менеджера, она ведь будет ждать окончания загрузки, переживать будет. А вдруг загружаемый файл содержит форматирование которое ломает процесс парсинга файла? Нужно отловить ошибку, сохранить внятный текст ошибки и показать ее менеджеру, ведь она должна знать что нужно исправить файл и попробовать снова его загрузить? Ведь мы люди, не звери.
Ну и тесты написать надо бы, вы же хотите спать более глубоким сном сознавая, что при изменении кода эта добавленная фича продолжает работать?

Вам нужно сделать механизм обновления записей? Тогда в загружаемом файле должны быть уникальные идентификаторы. Вы же будете как-то определять какой "color" из файла соответствует "color"у в БД.
Или нужно записи пересоздавать? В зависимости от этого и пишите логику.
Ну а UI сами продумайте, где ссылку добавить, где форму вывести.
Ответ написан
netpastor
@netpastor
Python developer
Кастомишь админку, добавляешь вьюху с нужным шаблоном , урл на нее вывешиваешь в templates/admin/{model}_change_list.html
https://docs.djangoproject.com/en/2.1/ref/contrib/...
Ответ написан
если это единоразовая ситуация - напрямую залить в базу
mysql и postgres это умеют делать "из коробки"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы