Django: Как я могу изменить значения через views.py
Я пытаюсь сделать страницу "upload", чтобы я мог загрузить файл и процесс в БД postgres с помощью pd.to_sql(). Все данные успешно записаны в БД, но не могу изменить значения "is_recorded" и "has_issue". Вот файлы, над которыми я работаю на данный момент.
В upload/models.py
from django.db import models
class Upload(models.Model):
file_name = models.FileField(upload_to='uploads', max_length=255)
uploaded = models.DateTimeField(auto_now_add=True)
# When uploaded successfully
is_recorded = models.BooleanField(default=False)
# When it has a problem to fix
has_issue = models.BooleanField(default=False)
def __str__(self):
return f'{self.file_name}: {self.id}'
В views.py
import os
from django.shortcuts import render
from core.db_implements import upload_csv_to_DB
from upload.forms import UploadForm
from upload.models import Upload
def upload_view(request):
error_message = None
success_message = None
form = UploadForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
form = UploadForm()
try:
obj = Upload.objects.get(is_recorded=False)
recorded, issue, success_message, error_message = ***upload_csv_to_DB***(obj)
obj.is_recorded = recorded
obj.has_issue = issue
obj.save()
success_message = success_message
error_message = error_message
except:
error_message = 'Something went wrong.'
context={
'form': form,
'success_message': success_message,
'error_message': error_message,
}
return render(request, 'upload/upload.html', context)
В файле forms.py
from django import forms
from django.db.models import fields
from django.forms.fields import FileField
from django.forms.models import ModelFormMetaclass
from .models import Upload
class UploadForm(forms.ModelForm):
# file_name = forms.FileField(max_length=255, label=False)
class Meta:
model=Upload
fields = ('file_name',)
widgets = {
'file_name': forms.FileInput(
attrs={
'class': 'form-control',
}
)
}
Я отдаю на аутсорсинг функцию (upload_csv_to_DB), которая принимает объект файла, преобразует его в датафрейм и записывает в DB. Если функция успешна, то должно быть возвращено значение recorded=True с сообщением sucess_message, однако, если что-то не так, то должно быть возвращено значение issue=True с сообщением error_message. В любом случае, recorded и issue всегда False, а error_message из except clause 'Something went wrong.'. Пожалуйста, посоветуйте мне...
Ваш Upload.objects.get возвращает несколько объектов
В вашем файле views.py вы пытаетесь получить один объект с помощью get(), но может быть несколько объектов Upload с is_recorded=False, поэтому get() возвращает исключение MultipleObjectsReturned. Поэтому попытка не удается, и за дело берется except.
obj = Upload.objects.get(is_recorded=False)
Я выяснил причину. Я не инициализировал возвращаемое значение аутсорсинговой функции upload_csv_to_DB
. После инициализации возвращаемых значений все работает как надо. Вот код, который решает проблему.
В upload_csv_to_DB.py
:
def upload_csv_to_DB(csv_obj):
recorded = False
issue = False
success_message = None
error_message = None
upload_file = csv_obj.file_name.path
...
return (recorded, issue, success_message, error_message)
В views.py
:
def upload_view(request):
error_message = None
success_message = None
recorded =False
issue = False
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
try:
obj = Upload.objects.get(is_recorded=False)
recorded, issue, success_message, error_message = upload_csv_to_DB(obj)
obj.is_recorded = recorded
obj.has_issue = issue
obj.save()
success_message = success_message
error_message = error_message
except:
error_message = 'Something went wrong.'
else:
form = UploadForm()
context={
'form': form,
'success_message': success_message,
'error_message': error_message,
}
return render(request, 'upload/upload.html', context)