在django中更新重复的学生信息

Updating duplicate student Information in django

我制作了一堆要上传到 Django 模型的 CSV 文件。 1. 创建一个视图来上传 csv 2.把字段分开,加到一个变量中 3.调用update_or_create()方法将信息添加到模型中。

我面临的问题是让 django 更新旧行而不是创建新行。如果学生第一年不及格,但第二年通过,则必须更新旧分数。

我正在尝试使用学生的注册号过滤 () 并 Class 以缩小范围。如果有一个学生,例如BA 1 SEM的AAAAAA1111,他们在2016年,2017年参加了考试,并在2018年通过了考试,最后的结果必须更新旧结果。

我附上了两份我用过的文件。一个是 2016 年的结果,第二个是 2017 年的中继器 csv。 LINK 至文件: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)

按照官方文档:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#update-or-create

您应该将传递给 update_or_create 的数据拆分为 kwargsdefaults,其中默认值是包含新值的字典,而 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"]) 此行仅查找当前 class 中的学生,但正如您所说,您希望更新旧标记,您只需确保导入已完成顺序正确。