Django: как решить проблему отношения нескольких иностранных ключей?

В настоящее время я изучаю Django и делаю электронный журнал успеваемости. Я полностью застрял, перепробовав все, но так и не смог решить проблему. Я объясню подробно и выложу весь соответствующий код ниже.

Мне нужно иметь две url-страницы "class_students" и "teacher_current". Первая страница предназначена для того, чтобы учитель мог видеть список учеников определенного класса. В таблице на этой странице есть столбец "действие". В каждой ячейке этого столбца есть кнопка View, чтобы учитель мог быть перенаправлен на страницу "teacher_current" и увидеть список текущих заданий, данных определенному ученику. На этой странице есть столбец "Отметка", ячейки которого могут содержать либо отметку, поставленную данному ученику, со ссылкой на другую страницу для обновления или удаления этой отметки, либо ссылку "Добавить отметку" для добавления отметки на другой странице.

Вот и проблема: все работает правильно, кроме того, что каждая отметка связана с классом Task через Foreign key, а НЕ с классом Student. Поэтому у каждого ученика одного класса одинаковые оценки за одинаковые задания. Но это, конечно, не поможет. Вот весь мой соответствующий код: 1) views.py models.py urls.py: https://www.codepile.net/pile/qkLKxx6g 2) шаблон страницы "class_students": https://www.codepile.net/pile/kpw2k6ay 3) шаблон страницы "teacher_current" https://www.codepile.net/pile/yaQq50aZ 4) add_mark.html https://www.codepile.net/pile/G6dGZbr3 5) mark_update.html https://www.codepile.net/pile/1jGlRApG

Что я пробовал: Сначала я подумал, что могу просто проверить, относится ли каждая отметка к ученику, но не к заданию, поэтому я изменил свой teacher_student_current.html следующим образом:

<td>
        {% if task.mark_set.get and task.mark_set.get.student_id == student %}
        <a href="{% url 'mark_update' pk=task.mark_set.get.id %}">{{ task.mark_set.get }}</a>
        {% else %}
        <a href="{% url 'mark_add' pk=student.id rel_task=task.id %}">Add mark</a>
        {% endif %}
    </td>

Добавление разных оценок за одинаковые задания разным ученикам одного класса работает, однако их отражение в таблице не работает.

Я также пробовал менять многие вещи в шаблоне, но часто получал ошибку get() returned more than one Mark - он возвращал число! Разумеется, поскольку отметка связана с заданием, а не с учеником, любые попытки получить отметку от ученика были неудачными.

После этого я попробовал фильтровать в views.py с помощью filter и даже Q loookups, например:

def teacher_student_current(request, pk):
    student = Student.objects.get(pk=pk)
    tasks_queryset = Task.objects.filter(mark__student_id=student).order_by('end_date')[:10]
    current_date = datetime.datetime.now()
    if "btnform1" in request.POST:
        return redirect("/school/student/all/")
    context = {
        "student": student,
        "current_date": current_date,
        "tasks_queryset": tasks_queryset,
    }
    return render(request, "teacher_student_current.html", context)

или

def teacher_student_current(request, pk):
    student = Student.objects.get(pk=pk)
    tasks_queryset = Task.objects.filter(
        Q(mark__student_id=None) |
        Q(mark__student_id=student)
    ).order_by('end_date')[:10]
    current_date = datetime.datetime.now()
    if "btnform1" in request.POST:
        return redirect("/school/student/all/")
    context = {
        "student": student,
        "current_date": current_date,
        "tasks_queryset": tasks_queryset,
    }
return render(request, "teacher_student_current.html", context)

Но ничего не помогает, потому что, даже если фильтрация работает, создавая заданную оценку определенному заданию, оно уже присвоено только одному ученику этого класса. А для другого ученика такого задания даже нет. Я уверен, что упустил логику и не знаю, как решить проблему. Буду рад вашей помощи, даже если вы просто посоветуете, что погуглить.

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