Повторение записи с помощью цикла 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.

Это, а также тот факт, что вы перебираете эти несколько строк кода, приведет к тому, что вы получите несколько записей.

Вернуться на верх