@Lepilov

Выбор логики реализации кода при формировании инстансов из csv файла?

Есть задача парсить csv файл и на основании полученных данных создавать инстансы в БД. На бэке DRF на фронте React.
Особенность в том, что обработка файла происходит не совсем скрыто. Логика такая:
Есть кнопка загрузки фала. Файл загружается, валидируется но сразу в БД ничего не создается. Появляется окно со списком спаршеных данных (типо таблицы) и в этом окне новая кнопка confirm по нажатию на которую уже запрос в БД идет.
Что я сейчас сделал:
1. Создал класс для загрузки файла (кнопка Upload)

class FileUploadView(APIView):
    parser_classes = ( MultiPartParser, FormParser)

    def put(self, request, format=None):
        if 'file' not in request.data:
            raise ParseError("Empty content")
        f = request.data['file']
        filename = f.name
        file_ext = filename[-4:]
        if file_ext == '.csv':
            file = default_storage.save(filename, f)
            r = csv_file_parser(file)
            status = 204
        else:
            status = 406
            r = "File format error"
        return Response({'response': r}, status=status)


В классе вызывается функция csv_file_parser результатом которой является json содержащий все спаршенные данные.

def csv_file_parser(file):

    with open(file) as csvfile:
        reader = csv.DictReader(csvfile)
        line_count = 1
        result_dict= {}
        for row in reader:
            for key, value in row.items():
                if not value:
                    raise ParseError('Missing value in file. Check the {} line'.format(line_count))
            new = {line_count: row}
            result_dict.update(new)
            line_count += 1
        return json.dumps(result_dict)


Код рабочий (если есть идеи по его оптимизации - велкам :) ). Что я не могу сообразить - это как мне впихнуть кнопку Confirm в код. Что и как использовать для этого?
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
@Realmixer
Full stack Python (Django) web-developer
Вы сейчас отправляете спаршенные данные с бэка на фронт. Ну так стройте на фронте форму подтверждения по этим данным. После нажатия на Confirm шлите эти данные прямо в виде json вновь на бэк. Но уже на другой эндпоинт, который примет эти данные и наделает в что-то в БД.

PS Вместо filename[-4:] расширение файла лучше получать так: os.path.splitext(filename). Ну или проверку делать так if filename.endswith('.csv').
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы