Обновление дубликата информации об ученике в django - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть куча CSV-файлов, которые я сделал для загрузки в django модель. 1. Создан вид для загрузки csv 2. Разделил поля и добавил их в переменную 3. Вызвал метод update_or_create () для добавления информации в модель.

Проблема, с которой я сталкиваюсь, заключается в получении django обновить старую строку вместо создания новой. Если учащийся потерпел неудачу в первый год, но сдает его в следующем году, старые оценки должны быть обновлены.

Я пытаюсь отфильтровать () номер регистрационного номера студента и класса, чтобы сузить его. Если есть студент с, например, AAAAAA1111 из BA 1 SEM, который сдал экзамен в 2016, 2017 и сдал в 2018 году, последний результат должен обновить старый результат.

Я прилагаю два документа, которые я использовал. Одним из них является результат 2016 года, а вторым является CSV ретрансляторов 2017 года. ССЫЛКА НА ФАЙЛЫ: https://drive.google.com/open?id=1_5cHRKNYdLBYWLhPw_Z4dn-VgX14Amw2

Вот как выглядит мой взгляд


    template = "uploadstudent.html"
    data = {}
    if "GET" == request.method:
        return render(request, template, data)
    # if not GET, then proceed

    csv_file = request.FILES["csv_file_student"]
    if not csv_file.name.endswith('.csv'):
        messages.error(request,'File is not CSV type')
        return redirect(request,template)

    data_set = csv_file.read().decode('UTF-8')    # setup a stream which is when we loop through each line we are able to handle a data in a stream
    io_string = io.StringIO(data_set)
    #loop over the lines and save them in db. If error , store as string and then display
    for fields in csv.reader(io_string, delimiter=',', quotechar="|"):
        data_dict = {}
        data_dict["registerNo"] = fields[0]
        data_dict["studentName"] = fields[1]
        data_dict["result"] = fields[2]
        data_dict["totalMarks"] = fields[3]
        data_dict["studentClass"] = fields[4]
        data_dict["exam"] = fields[5]
        data_dict["subject1"] = fields[6]
        data_dict["subject1Marks"] = fields[7]
        data_dict["subject1Result"] = fields[8]
        data_dict["subject2"] = fields[9]
        data_dict["subject2Marks"] = fields[10]
        data_dict["subject2Result"] = fields[11]
        data_dict["subject3"] = fields[12]
        data_dict["subject3Marks"] = fields[13]
        data_dict["subject3Result"] = fields[14]
        data_dict["subject4"] = fields[15]
        data_dict["subject4Marks"] = fields[16]
        data_dict["subject4Result"] = fields[17]
        data_dict["subject5"] = fields[18]
        data_dict["subject5Marks"] = fields[19]
        data_dict["subject5Result"] = fields[20]
        data_dict["subject6"] = fields[21]
        data_dict["subject6Marks"] = fields[22]
        data_dict["subject6Result"] = fields[23]
        #data_dict["subject7"] = fields[24]
        #data_dict["subject7Marks"] = fields[25]
        #data_dict["subject7Result"] = fields[26]
        #print(data_dict["studentClass"])
        #print(data_dict)
        studentInfo = studentResult.objects.filter(studentClass__icontains=data_dict["studentClass"], registerNo__icontains=data_dict["registerNo"]).update_or_create(
                registerNo=data_dict["registerNo"],
                studentName=data_dict["studentName"],
                result=data_dict["result"],
                studentClass=data_dict["studentClass"],
                totalMarks=data_dict["totalMarks"],
                exam=data_dict["exam"],
                subject1=data_dict["subject1"],
                subject1Marks=data_dict["subject1Marks"],
                subject1Result=data_dict["subject1Result"],
                subject2=data_dict["subject2"],
                subject2Marks=data_dict["subject2Marks"],
                subject2Result=data_dict["subject2Result"],
                subject3=data_dict["subject3"],
                subject3Marks=data_dict["subject3Marks"],
                subject3Result=data_dict["subject3Result"],
                subject4=data_dict["subject4"],
                subject4Marks=data_dict["subject4Marks"],
                subject4Result=data_dict["subject4Result"],
                subject5=data_dict["subject5"],
                subject5Marks=data_dict["subject5Marks"],
                subject5Result=data_dict["subject5Result"],
                subject6=data_dict["subject6"],
                subject6Marks=data_dict["subject6Marks"],
                subject6Result=data_dict["subject6Result"],
                #subject7=data_dict["subject7"],
                #subject7Marks=data_dict["subject7Marks"],
                #subject7Result=data_dict["subject7Result"]
                )



    #return render(request, "listuploads.html", context)

1 Ответ

0 голосов
/ 23 апреля 2020

В соответствии с официальной документацией: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#update -или-создать

Вы должны разбить данные, которые вы передаете в update_or_create, на kwargs и defaults, где По умолчанию это словарь, содержащий новые значения, и kwargs должен быть unique identifiers вашего ученика, например registerNo

примерно так:

studentInfo, created = studentResult.objects.update_or_create(registerNo=data_dict["registerNo"],
          defaults={
                'studentName':data_dict["studentName"],
                'result':data_dict["result"],
                'studentClass':data_dict["studentClass"],
                'totalMarks':data_dict["totalMarks"],
                 # and so on....
           })

Я удалил filter(studentClass__icontains=data_dict["studentClass"]) эта строка ищет только учащегося в текущем классе, но, как вы заявили, что хотите обновить старые оценки, вам нужно только убедиться, что импорт выполнен в правильном порядке.

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