Невозможно импортировать Excel в базу данных - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть система, позволяющая импортировать в систему файл посещаемости студентов. Однако, это не импортировало это успешно. Я попытался отладить, и я обнаружил, что когда он идет к функции importer.py, он не go к "def _do_save (self, row)", следовательно, это проблема, почему он не был сохранен в базе данных.

importer.py

class AttendanceImporter(CsvImporter):

    field_names=["username", "mark"]

    #it does not go to the method.
    def _handle_row(self,row):
        print("this")
        if (not self._is_row_valid(row)):
            return self._FAILED


        username=row["username"]
        if (self._is_username_exist(username)):
            if (self._is_mark_exist(username)):
                if (self._do_update(row)):
                    return self._UPDATED
                else:
                    return self._FAILED
            else:
                if (self._do_save(row)):
                    return self._CREATED
                else:
                    return self._FAILED
        else:
            return self._FAILED

    def _is_row_valid(self, row):
        for item in self.field_names:
            if (len(row[item])==0):
                return False
        return True

    def _is_username_exist(self, username):
        return len(User.objects.filter(username=username))>0
        print(username)

    def _is_mark_exist(self, username):
        user = User.objects.get(username=username)
        return len(Attendance.objects.filter(user=user))>0
        print(username)

    def _do_save(self, row):
        # create attendace mark
        try:
            attendance=Attendance()
            user=User.objects.get(username=row["username"])
            attendance=Attendance.objects.create(user=user, mark=row["mark"])
            print("save?")
            attendance.save()
        except:
            return False

        return True

    def _do_update(self, row):
        # update attendance mark
        try:
            user=User.objects.get(username=row["username"])
            attendance=Attendance.objects.get(user=user)
            attendance.mark = row["mark"]
            attendance.save()
        except Exception as e:
            print(e)
            return False

        return True    

Views.py

@transaction.atomic
@csrf_exempt
def data_import(request, file_type):


# TODO: currently only support importing users, later can support importing groups
fields_required = None
if(file_type == "user"):
    fields_required = "username, password, email, matric_number, fullname, groups"
elif (file_type == "attendance"):
    fields_required = "username, mark"


if request.FILES:
    successful = False
    try:
        im = None
        if(file_type == "user"):
            upload_file = request.FILES['user_file']
            file_path = save_uploaded_file(request.FILES['file'], filename=generate_unique_file_name(extension="csv"),
                                       filedir=USER_DATA_UPLOAD_PATH)
            im = StudentImporter(source=open(file_path))
        elif (file_type == "attendance"):
            upload_file = request.FILES['attendance_file']

            file_path = save_uploaded_file(upload_file, filename=generate_unique_file_name(extension="csv"),
                                            filedir=USER_DATA_UPLOAD_PATH)

            im = AttendanceImporter(source=open(file_path))

        successful, result = im.import_to_database()

    except Exception:
        pass
    if successful:
        messages.info(request, "The import is successful!\n" + result)
    else:
        messages.warning(request, "The import is NOT successful, no data is imported!")
    return HttpResponseRedirect(reverse("student_user_profile_list"))
return render(request,
              "app-appglobal/import-data.html",
              {'type': file_type, 'fields_required': fields_required})

Model.py:

class Attendance(models.Model):
    user=models.OneToOneField(User, on_delete=models.CASCADE)
    mark=models.IntegerField(default=0)
    class Meta:
        ordering=['user']
    def get_mark(self):
        return self.mark

URL

   url(r'^student/attendance/$' ,views.data_import,{'file_type':'attendance'},name='attendance_import'),

CSVIMPORTER

class CsvImporter(object, metaclass=ABCMeta):
def __init__(self, source):
    """
    :param source: a file object
    :return:
    """
    self.source=source

def import_to_database(self):
    """
    :return: (successful:boolean,result:string)
    """
    pass

пример:

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...