在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
的数据拆分为 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"])
此行仅查找当前 class 中的学生,但正如您所说,您希望更新旧标记,您只需确保导入已完成顺序正确。
我制作了一堆要上传到 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
的数据拆分为 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"])
此行仅查找当前 class 中的学生,但正如您所说,您希望更新旧标记,您只需确保导入已完成顺序正确。