Django - 从一个 table 中获取属于另一个 table 中另一个对象的对象
Django - get objects from one table who belong to another objects in other table
我有一个项目要做,其中包括在 Django 中创建一个笔记管理器。所以我用外键在 sql 中创建了我的表。几天来我一直面临一个问题。我有一个列出数据库中所有学生的页面,我想通过单击 link,能够显示属于每个学生的所有笔记。
这是我的 SQL 表格(学生 = 学生/笔记 = 成绩):
sql students table/
sql grade table
models.py :
class Etudiants(models.Model):
numeroetudiant = models.BigIntegerField(db_column='numeroEtudiant', blank=True, null=True) # Field name made lowercase.
nom = models.CharField(max_length=255, blank=True, null=True)
prenom = models.CharField(max_length=255, blank=True, null=True)
groupe = models.BigIntegerField(blank=True, null=True)
photo = models.TextField(blank=True, null=True)
email = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'etudiants'
def __str__(self):
return self.nom + " " + self.prenom
class Notes(models.Model):
examens = models.ForeignKey(Examens, models.DO_NOTHING, db_column='examens', blank=True, null=True)
etudiant = models.ForeignKey(Etudiants, models.DO_NOTHING, db_column='etudiant', blank=True, null=True)
note = models.BigIntegerField(blank=True, null=True)
appreciation = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'notes'
def __str__(self):
return "Note de " + self.etudiant.nom + " " + self.etudiant.prenom + " à l'examen de " + self.examens.titre
views.py :
def etudiants(request):
etudiants = Etudiants.objects.all()
return render(request, 'etudiants.html', {'etudiants': etudiants, 'notes': notes})
def affichenote(request, id):
notes = Notes.objects.all()
return render(request, 'affichenote.html', {'notes': notes})
urls.py :
path('etudiants/', views.etudiants, name='etudiants'),
path('affichenote/<int:id>/', views.affichenote, name='affiche-note'),
etudiants.html :
{% extends 'base.html' %} {% block content %}
<div class="row">
{% for Etudiants in etudiants %}
<div class="col-sm-4">
<div class="card">
<img src="..." class="card-img-top" alt="..." />
<div class="card-body">
<h5 class="card-title">{{ Etudiants.nom }} {{ Etudiants.prenom }} </h5>
<p class="card-text">
E-mail : {{ Etudiants.email }} <br>
Numéro étudiant : {{ Etudiants.numeroetudiant }} <br>
Groupe : {{ Etudiants.groupe }} <br>
</p>
<a href="../affichenote/{{Etudiants.id}}/" class="btn btn-primary">Voir les notes</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
如果你想通过点击link,你将能够显示属于每个学生的所有笔记。所以你可以通过以下方式通过学号申请filter()
:
views.py
def etudiants(request):
etudiants = Etudiants.objects.all()
return render(request, 'etudiants.html', {'etudiants': etudiants})
def affichenote(request, id):
notes = Notes.objects.filter(etudiant__id=id)
return render(request, 'affichenote.html', {'notes': notes})
urls.py
urlpatterns = [
path('etudiants/', views.etudiants, name='etudiants'),
path('affichenote/<int:id>/', views.affichenote, name='affichenote'),
]
etudiants.html
<div class="row">
{% for etudiant in etudiants %}
<div class="col-sm-4">
<div class="card">
<img src="..." class="card-img-top" alt="..." />
<div class="card-body">
<h5 class="card-title">{{ etudiant.nom }} {{ etudiant.prenom }} </h5>
<p class="card-text">
E-mail : {{ etudiant.email }} <br>
Numéro étudiant : {{ etudiant.numeroetudiant }} <br>
Groupe : {{ etudiant.groupe }} <br>
</p>
<a href="{% url 'affichenote' etudiant.id %}" class="btn btn-primary">Voir les notes</a>
</div>
</div>
</div>
{% endfor %}
</div>
然后,在 affichenote.html
中,您可以访问与学生相关的所有笔记。
affichenote.html
<body>
{% for note in notes %}
<p>{{note.edudiant}}</p>
<p>{{note.note}}</p>
<p>{{note.appreciation}}</p>
{% endfor %}
</body>
Note:
django中的模型一般写成单数形式,如果命名为Etudiant
和Note
而不是Etudiants
会更好 和 Notes
,因为 s
本身已经添加为每个模型的后缀。
我有一个项目要做,其中包括在 Django 中创建一个笔记管理器。所以我用外键在 sql 中创建了我的表。几天来我一直面临一个问题。我有一个列出数据库中所有学生的页面,我想通过单击 link,能够显示属于每个学生的所有笔记。
这是我的 SQL 表格(学生 = 学生/笔记 = 成绩):
sql students table/ sql grade table
models.py :
class Etudiants(models.Model):
numeroetudiant = models.BigIntegerField(db_column='numeroEtudiant', blank=True, null=True) # Field name made lowercase.
nom = models.CharField(max_length=255, blank=True, null=True)
prenom = models.CharField(max_length=255, blank=True, null=True)
groupe = models.BigIntegerField(blank=True, null=True)
photo = models.TextField(blank=True, null=True)
email = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'etudiants'
def __str__(self):
return self.nom + " " + self.prenom
class Notes(models.Model):
examens = models.ForeignKey(Examens, models.DO_NOTHING, db_column='examens', blank=True, null=True)
etudiant = models.ForeignKey(Etudiants, models.DO_NOTHING, db_column='etudiant', blank=True, null=True)
note = models.BigIntegerField(blank=True, null=True)
appreciation = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'notes'
def __str__(self):
return "Note de " + self.etudiant.nom + " " + self.etudiant.prenom + " à l'examen de " + self.examens.titre
views.py :
def etudiants(request):
etudiants = Etudiants.objects.all()
return render(request, 'etudiants.html', {'etudiants': etudiants, 'notes': notes})
def affichenote(request, id):
notes = Notes.objects.all()
return render(request, 'affichenote.html', {'notes': notes})
urls.py :
path('etudiants/', views.etudiants, name='etudiants'),
path('affichenote/<int:id>/', views.affichenote, name='affiche-note'),
etudiants.html :
{% extends 'base.html' %} {% block content %}
<div class="row">
{% for Etudiants in etudiants %}
<div class="col-sm-4">
<div class="card">
<img src="..." class="card-img-top" alt="..." />
<div class="card-body">
<h5 class="card-title">{{ Etudiants.nom }} {{ Etudiants.prenom }} </h5>
<p class="card-text">
E-mail : {{ Etudiants.email }} <br>
Numéro étudiant : {{ Etudiants.numeroetudiant }} <br>
Groupe : {{ Etudiants.groupe }} <br>
</p>
<a href="../affichenote/{{Etudiants.id}}/" class="btn btn-primary">Voir les notes</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
如果你想通过点击link,你将能够显示属于每个学生的所有笔记。所以你可以通过以下方式通过学号申请filter()
:
views.py
def etudiants(request):
etudiants = Etudiants.objects.all()
return render(request, 'etudiants.html', {'etudiants': etudiants})
def affichenote(request, id):
notes = Notes.objects.filter(etudiant__id=id)
return render(request, 'affichenote.html', {'notes': notes})
urls.py
urlpatterns = [
path('etudiants/', views.etudiants, name='etudiants'),
path('affichenote/<int:id>/', views.affichenote, name='affichenote'),
]
etudiants.html
<div class="row">
{% for etudiant in etudiants %}
<div class="col-sm-4">
<div class="card">
<img src="..." class="card-img-top" alt="..." />
<div class="card-body">
<h5 class="card-title">{{ etudiant.nom }} {{ etudiant.prenom }} </h5>
<p class="card-text">
E-mail : {{ etudiant.email }} <br>
Numéro étudiant : {{ etudiant.numeroetudiant }} <br>
Groupe : {{ etudiant.groupe }} <br>
</p>
<a href="{% url 'affichenote' etudiant.id %}" class="btn btn-primary">Voir les notes</a>
</div>
</div>
</div>
{% endfor %}
</div>
然后,在 affichenote.html
中,您可以访问与学生相关的所有笔记。
affichenote.html
<body>
{% for note in notes %}
<p>{{note.edudiant}}</p>
<p>{{note.note}}</p>
<p>{{note.appreciation}}</p>
{% endfor %}
</body>
Note:
django中的模型一般写成单数形式,如果命名为Etudiant
和Note
而不是 和 Etudiants
会更好,因为 Notes
s
本身已经添加为每个模型的后缀。