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)
Вернуться на верх