Django: Путаница с доступом к данным внешнего ключа модели базы данных

Это мой первый опыт работы с Django, и в процессе работы я столкнулся с путаницей при создании определенного оператора в представлениях, который приводит к желаемому результату. Я создал модель 'Parents', которая содержит данные конкретного ученика (внешний ключ), и я запутался, как получить доступ к этому идентификатору ученика для дальнейшего процесса, например, для работы с посещаемостью или результатами этого конкретного ученика. Ниже приведены необходимые коды и мои попытки получить данные.

Models.py

class Students(models.Model):
    id = models.AutoField(primary_key=True)
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    gender = models.CharField(max_length=50)
    address = models.TextField()
    course_id = models.ForeignKey(Courses, on_delete=models.DO_NOTHING, default=1)
    session_year_id = models.ForeignKey(SessionYearModel, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = models.Manager()

    def __str__(self):
        return self.admin.first_name + " " + self.admin.last_name

class Parents(models.Model):
    id = models.AutoField(primary_key=True)
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    gender = models.CharField(max_length=50)
    **student = models.ForeignKey(Students, on_delete=models.CASCADE)**
    relation = models.CharField(max_length=255)
    address = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = models.Manager()

    def __str__(self):
        return self.admin.first_name + " " + self.admin.last_name

Здесь у меня есть две модели, модель Students содержит всю информацию о студенте, а другая модель Parent содержит информацию о родителе с его конкретным идентификатором студента.

Ниже приведен код файла представлений, в котором я пытаюсь получить идентификатор студента, вошедшего в систему в данный момент,

def HOME(request):
    stud_data = Parents.objects.filter(student__id = request.user.id)
    print(stud_data)
    return None

Во время перезагрузки страницы я получаю пустой QuerySet[], поскольку он не может найти id.

Помогите мне найти решение этой проблемы, чтобы я мог продолжать думать над разработкой.

Спасибо :)

Как вы упомянули здесь, вы ищете данные студента для текущего зарегистрированного родителя. Следовательно, вы можете искать данные студента непосредственно в объекте Parent. Например, так:

stud_object = request.user.parent.student

Это отношение работает, потому что Parent имеет отношение OneToOne с CustomUser (я предполагаю, что модель Authentication's custom User), следовательно, вы должны получить объект Parent из request.user.parent (обратное отношение для OneToOne). Также, поле student является ForeignKey модели Parent.

Дополнительно, я думаю, что отношение между родителями и студентами должно быть ManyToMany, потому что у студента может быть несколько родителей, а у одного родителя может быть несколько студентов (или детей).

Есть две возможности:

  1. Код View, который вы приложили, должен возвращать stud_data не None, но я предполагаю, что вы знаете это, и текущее состояние кода предназначено только для отладки.
  2. В request.user.id содержится значение, которое не принадлежит ни одному ID студента в базе данных. Поскольку вы используете filter, он не будет жаловаться на это и просто вернет вам пустой QuerySet. Я бы предложил использовать здесь фильтр get(), который вызывает исключение DoesNotExist и поможет в отладке.
def home(request):
    stud_data = Parents.objects.get(student__id = request.user.id)
    return stud_data

Надеюсь, это поможет!

Желаю удачи в новом путешествии!

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