Как использовать Post-save Signal при загрузке документа, а также сохранение до и после изменения документа?

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

Так я пытался это сделать, загрузка и сохранение работают, но сценарий pandas не работает.

def my_view(request):
    message = 'Upload as many files as you want!'
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            
            newdoc = Document(docfile=request.FILES['docfile'])
            
            newdoc.save()
            
            #This part is doing calculations for uploaded file
            dfs = pd.read_excel(newdoc, sheet_name=None)
            with pd.ExcelWriter('output_' + newdoc + 'xlsx') as writer:
                for name, df in dfs.items():
                    print(name)
                    data = df.eval('d = column1 / column2')
                    ooutput = data.eval('e = column1 / d')
                    ooutput.to_excel(writer, sheet_name=name)
                    output = io.BytesIO()
                    writer = pd.ExcelWriter(output, engine='xlsxwriter')
                    newdoc.to_excel(writer, index=False)
                    writer.save()
                    output.seek(0)
                    response = HttpResponse(output,
                        content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
                    response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % 'Download'
                    return response
            
            return redirect('results')
        else:
            message = 'The form is not valid. Fix the following error:'
    else:
        form = DocumentForm()  

    documents = Document.objects.all()

    context = {'documents': documents, 'form': form, 'message': message}
    return render(request, 'list.html', context)


def results(request):
    documents = Document.objects.all()
    context = {'documents': documents}
    return render(request, 'results.html', context)
dfs = pd.read_excel(newdoc, sheet_name=None)

Вы передаете сюда newdoc, который является вашей моделью, а не объектом IO.

Попробовать

dfs = pd.read_excel(newdoc.docfile, sheet_name=None)

или

 dfs = pd.read_excel(newdoc.docfile.file, sheet_name=None)

Это не ответ, а мое предположение, вы следуете неправильному пути реализации.

  1. Вы можете установить фоновый процесс в Celery
  2. .
  3. После завершения работы в Celery вы можете отправить по почте/уведомить пользователя с URL загрузки.

Приведенное выше решение будет длинным, но масштабируемым и ориентированным на производительность.

Вернуться на верх