Повторение записи с помощью цикла for в базе данных
В этом коде я пытаюсь добавить запись студента в базу данных посещаемости всякий раз, когда изображение студента захватывается веб-камерой, поэтому name = имя изображения, хранящегося добавляя, что имя изображения совпадает с studentid, хранящимся в сущности 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
уникального элемента в вашем кверисете, а затем смотрите, содержит ли ваш кверисет это же значение.
Но ваш набор запросов содержит экземпляры Student
, а не id
, поэтому он не возвращает True
.
Это, а также тот факт, что вы перебираете эти несколько строк кода, приведет к тому, что вы получите несколько записей.