def p_recheck_leanred_words(user): """ 重新检查并计算给定用户的已学习生词的信息。 参数: 待重新检查的用户的 ID。 """ with transaction.atomic(): LearnedWord.objects.all().delete() question_dict = {} for question in Question.objects.filter(user_id = user.id, answered = True): if question.related_word_id not in question_dict: question_dict[question.related_word_id] = [] question_dict[question.related_word_id].append(question) for key, value in question_dict.items(): learned_word = LearnedWord(word_id = key, user_id = user.id) learned_word.save() value.sort(key = lambda q: q.answer_date) unfamiliarity = 1 learned_word.learned_date = current_date = value[0].answer_date.date() total_answered_count = 0 correct_answered_count = 0 for question in value: time_delta = question.answer_date.date() - current_date unfamiliarity = p_calculate_unfamiliarity_with_params(time_delta, unfamiliarity, correct_answered_count) total_answered_count += 1 if question.answer_is_correct: correct_answered_count += 1 unfamiliarity -= 1 / UNFAMILIARITY_COEFFICIENT else: unfamiliarity += 1 / UNFAMILIARITY_COEFFICIENT unfamiliarity = p_bound_value(unfamiliarity, (0, 1)) current_date = question.answer_date.date() learned_word.last_review_date = current_date learned_word.total_answered_count = total_answered_count learned_word.correct_answered_count = correct_answered_count learned_word.unfamiliarity = unfamiliarity learned_word.save()