Comment écrire une vue Django pour obtenir CharFields de plusieurs modèles Django qui ne sont accessibles que par le biais des relations
-
21-08-2019 - |
Question
S'il vous plaît voir les modèles Django suivants: -
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)
Je dois afficher le dernier modèle « EducationalQualification) pour un étudiant donné dans une grille (un étudiant peut avoir plusieurs EducationalQualifications).
La grille comporte des colonnes pour « Nom de l'étudiant », « Nom court de l'examen », « Nom abrégé du sujet », « EducationalQualification.institution », « EducationalQualification.from_date », « EducationalQualification.to_date » et « EducationalQualification. marques ».
Je suis incapable de trouver une vue Django pour obtenir ces données (donné une Student.pk)
Quelqu'un pourrait-il me aider s'il vous plaît quelques idées?
Cordialement.
La solution
Vous avez juste besoin de chercher tous les objets pour certains EducationalQualification
étudiant avec tous leurs objets de relation:
def view_qualifications(request, student_id):
qs = EducationalQualification.objects.filter(student__pk=student_id).\
select_related("student", "examination", "subject")
# ...
Et puis dans le modèle juste itérer throught il:
{% 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 %}
Autres conseils
Créer une vue de base de données et un modèle qui spécifie dans sa managed = False
classe Meta.