在数据库中使用for循环重复记录



在此代码中,我试图在出勤率数据库中添加学生记录,每当学生图像被网络摄像头捕获时,因此name =存储的图像名称添加图像名称与存储在Student实体中的学生名称相同,当检测到的人脸名称存在name =图像名称列表时然后将学生信息添加到考勤数据库中。

代码只是工作得很好,但它不断重复记录,我怎么能限制它只添加一次记录,而不重复它。

def markattendance(name):
for n in Names:
if name in Names:
# print(name, "Exist")
# fitches the information related to the detected name
attend = Student.objects.filter(student_id=name).values('student_id', 'student_fname', 'student_lname','fk_course_id_id')
#print(attend)
# filter returns a queryset. A queryset isn't a single object, it's a group of objects so it doesn't make sense
# to call save() on a queryset. Instead you save each individual object IN the queryset:
for object in attend:
#print(object)
if object.get('student_id') not in attend:
# INSERT SQL statement behind the scenes. Django doesn’t hit the database until you explicitly call save().
reg = Attendance(student_id=object.get('student_id'),
student_fname=object.get('student_fname'),
student_lname=object.get('student_lname'),
course_id=object.get('fk_course_id_id'))
# print(reg)
reg.save()
else:
pass

我将试着回答我对你的代码的理解(这可能不是完美的,如果我错了请纠正我)。

首先,开始时的for循环是无用的,在那里引入的n变量一次也没有使用。这可能就是问题的来源,因为你一次又一次地执行相同的代码。

现在,您的attend查询集可能包含一个Student实例,因为您通过id过滤,我猜这在所有学生中是唯一的。然后你不应该循环遍历它的每个元素,因为只有一个。

最后,您的if object.get('student_id') not in attend:行将始终返回False。您将获得查询集中唯一元素的student_id的值,然后查看您的查询集中是否包含相同的值。

但是你的queryset包含Student实例,而不是id,所以它不会返回True

这一点,加上您正在循环这几行代码的事实,将导致您获得多条记录。

你可能需要这样的东西(根据我的理解):

def markattendance(name):
if name in Names:
attend = Student.objects.filter(student_id=name).values('student_id', 'student_fname', 'student_lname','fk_course_id_id')
student_with_name = attend[0]
reg = Attendance(student_id=object.get('student_id'),
student_fname=object.get('student_fname'),
student_lname=object.get('student_lname'),
course_id=object.get('fk_course_id_id'))
reg.save()

最新更新