Рендеринг нескольких моделей с пк в одном представлении

Я пытаюсь передать lesson.price, и lesson.invoice_id из модели Lesson и student.student_id из модели Student в единое представление, чтобы я мог отобразить их в шаблоне. Однако в модели Lesson есть поле "student", которое имеет внешний ключ к User, а не к модели Student. Вы увидите, что мой код для класса представления неправильный, поскольку я не знаю, как получить правильный объект student с первичным ключом, который используется для объекта lesson. Как я могу получить правильный объект student с первичным ключом lesson_id в классе view?

class User(AbstractUser):
'''User model for authentication and lessons authoring.'''

class Role(models.TextChoices):
    ADMIN="ADMIN",'Admin'
    STUDENT="STUDENT",'Student'
    TEACHER="TEACHER",'Teacher'
id = models.AutoField(primary_key=True)
username   = models.CharField(
    max_length=30,
    unique=True,
    validators=[RegexValidator(
        regex=r'^@\w{3,}$',
        message='Username must consist of @ followed by at least three alphanumericals.'
    )]
)
first_name = models.CharField(max_length=50)
last_name  = models.CharField(max_length=50)
email      = models.EmailField(unique=True, blank=False)
gender     = models.CharField(max_length=255)
address    = models.TextField(default='')
baseRole   = Role.ADMIN
role       = models.CharField(max_length=50, choices=Role.choices)
created_at = models.DateTimeField(default=timezone.now, blank=True)
updated_at = models.DateTimeField(default=timezone.now, blank=True)

def save(self, *args, **kwargs):
    self.role = self.baseRole
    return super().save(*args, **kwargs)

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

class Student(User):
student_id = models.CharField(max_length=10, default=uuid.uuid4)
baseRole = User.Role.STUDENT
student = StudentManager()


class Lesson(models.Model):
lesson_id   = models.AutoField(primary_key=True)
lesson_name = models.CharField(max_length=255)
student     = models.ForeignKey(User,on_delete=models.DO_NOTHING,related_name='studying', unique=True)
teacher     = models.ForeignKey(User,on_delete=models.CASCADE, related_name='teaching')
start_time  = models.DateTimeField(default=timezone.now)
interval    = models.IntegerField()
duration    = models.IntegerField()
created_at  = models.DateTimeField(default=timezone.now, blank=True)
updated_at  = models.DateTimeField(default=timezone.now, blank=True)
is_request  = models.BooleanField()
number      = models.IntegerField(default=0)
invoice_id = models.CharField(max_length=10, default=uuid.uuid4)

@property
def price(self):
    return self.duration/5 * self.number



@staticmethod
def durations():
    return [20, 30, 40, 45, 60]

@staticmethod
def subjects():
    return ['Guitar','Violin','Piano', 'Voice', 'Cello','Ukulele','Recorder', 'Drums']

@staticmethod
def intervals():
    return [2, 5, 7, 10, 14]

def __str__(self):
    return "Lesson id: "+str(self.lesson_id)+", Student id: "+str(self.student.id)+", Student: "+str(self.student)

views.py

def invoice(request, lesson_id):
lesson = Lesson.objects.get(lesson_id=lesson_id)
student = Lesson.student.get(student_id=lesson.student.student_id)
return render(request, 'invoice.html', {'lesson':lesson, "student":student})

invoice.html

{% extends 'student/student_home_base.html' %}
{% block student_content %}

<head>Your Invoice</head>
<p>Your invoice reference number is{{lesson.student_id}}-{{lesson.invoice_id}}</p>

<p>Your Total Payable is {{lesson.price}}</p>

<p>Once you're done paying, please click this button below.</p>
<input type="submit" value="submit">


{% endblock %}
lesson = Lesson.objects.get(lesson_id=lesson_id) # you get the Lesson object
student = lesson.student # call the student attribute on the variable "lesson" not the Class Lesson

Обратите внимание, что переменная lesson содержит экземпляр класса Lesson. Обратите внимание, что переменная student будет фактически содержать экземпляр класса User. Если вы хотите получить экземпляр Student, вам следует сделать:

student = lesson.student.student

где lesson в объекте Lesson, первый .student вызывает отношение foreignkey с User, а второй .student является родственным объектом Student, связанным неявным отношением OneToOne (с User) благодаря многотабличному наследованию. все подробности здесь .

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