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, потому что у студента может быть несколько родителей, а у одного родителя может быть несколько студентов (или детей).
Есть две возможности:
- Код View, который вы приложили, должен возвращать
stud_data
не None, но я предполагаю, что вы знаете это, и текущее состояние кода предназначено только для отладки. - В
request.user.id
содержится значение, которое не принадлежит ни одному ID студента в базе данных. Поскольку вы используетеfilter
, он не будет жаловаться на это и просто вернет вам пустойQuerySet
. Я бы предложил использовать здесь фильтрget()
, который вызывает исключениеDoesNotExist
и поможет в отладке.
def home(request):
stud_data = Parents.objects.get(student__id = request.user.id)
return stud_data
Надеюсь, это поможет!
Желаю удачи в новом путешествии!