Как использовать 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)
Это не ответ, а мое предположение, вы следуете неправильному пути реализации.
- Вы можете установить фоновый процесс в Celery .
- После завершения работы в Celery вы можете отправить по почте/уведомить пользователя с URL загрузки.
Приведенное выше решение будет длинным, но масштабируемым и ориентированным на производительность.