В нынешнем виде Студент на самом деле не играет в уравнение.Все, что имеет значение, это то, какие варианты доступны для конкретного рассматриваемого экзамена (где Студент только номинально связан, поскольку конкретный экзамен является точкой данных на нем).
Таким образом, в этом случае доступные вариантыдля студента всегда есть функция:
some_student.exam_taken.available_options.all()
То, что вы можете пожелать, - это способность студента сдать несколько экзаменов, а затем иметь все доступные вариантыдля всех сданных экзаменов - своего рода совокупность.
В таком случае, во-первых, вам потребуется M2M-связь, установленная между студентом и экзаменом (вместо внешнего ключа).Затем вы можете получить все доступные варианты из всех экзаменов по:
Option.objects.filter(exam__student=some_student).distinct()