Cómo escribir una vista de Django para obtener CharFields de múltiples modelos de Django que sólo se puede acceder a través de las relaciones
-
21-08-2019 - |
Pregunta
Por favor, consulte los siguientes modelos de Django: -
class Student(models.Model):
reference_num = models.CharField(max_length=50, unique=True)
name = models.CharField(max_length=50)
birthdate = models.DateField(null=True, blank=True)
is_active = models.BooleanField(db_index=True)
class Examination(models.Model):
short_name = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=50, unique=True)
is_active = models.BooleanField(db_index=True)
class Subject(models.Model):
short_name = models.CharField(max_length=20, unique=True)
name = models.CharField(max_length=50, unique=True)
is_active = models.BooleanField(db_index=True)
class EducationalQualification(models.Model):
student = models.ForeignKey(Student)
examination = models.ForeignKey(Examination)
subject = models.ForeignKey(Subject, null=True, blank=True)
institution = models.CharField(max_length=50)
from_date = models.DateField(null=True, blank=True)
to_date = models.DateField()
marks = models.DecimalField(max_digits=5, decimal_places=2)
necesito para mostrar el último modelo de "EducationalQualification) para un estudiante determinado en una cuadrícula (un estudiante puede tener múltiples EducationalQualifications).
La rejilla tiene columnas para "Nombre del estudiante", "nombre corto del examen", "Corto Nombre del sujeto", "EducationalQualification.institution", "EducationalQualification.from_date", "EducationalQualification.to_date", y "EducationalQualification. marcas".
He sido incapaz de llegar a una vista de Django para obtener estos datos (dado un Student.pk)
Podría alguien por favor me ayude con algunas ideas?
Saludos.
Solución
Sólo tiene que ir a buscar todos los objetos EducationalQualification
para ciertos estudiantes con todos sus objetos de relación:
def view_qualifications(request, student_id):
qs = EducationalQualification.objects.filter(student__pk=student_id).\
select_related("student", "examination", "subject")
# ...
Y luego, en lo que hace es repetir throught que:
{% for q in qs %}
<tr>
<td>{{q.student.name}}</td>
<td>{{q.examination.short_name}}</td>
<td>{{q.subject.short_name}}</td>
<td>{{q.institution}}</td>
<td>{{q.from_date}}</td>
<td>{{q.to_date}}</td>
<td>{{q.marks}}</td>
</tr>
{% endfor %}
Otros consejos
Crear una vista de base de datos y un modelo que especifica managed = False
en su clase Meta.