传递模板的几个参数
问题描述:
首先,让我原谅我的英语 - 这不是我的母语。传递模板的几个参数
我有以下型号:
class Student(models.Model):
student_id = models.IntegerField(primary_key=True)
student_name = models.CharField(max_length=255, default='John Doe')
dob = models.DateField(max_length=8)
class Group(models.Model):
group_name = models.CharField(max_length=40)
monitor = models.ForeignKey(Student)
class Student_Group(models.Model):
student_id = models.ForeignKey(Student)
group_name = models.ForeignKey(Group)
我需要渲染的学生,其显示器和学生各组量的群体。制作前两项任务是没有问题的:
views.py:
def group_list(request):
groups = Group.objects.all()
return render(request, 'groups/group_list.html', {'groups': groups})
groups.html
{% for group in groups %}
<p>{{ group.group_name }}</p>
<p>{{ group.monitor }}</p>
{% endfor %}
但是,当涉及到渲染的学生数量为每个组,我陷入困境。
下面的SQL可以在给定的组数学生的数量
select count(*) from students_student
join students_student_group
on students_student.student_id = students_student_group.student_id_id
where students_student_group.group_name_id = "Mega nerds"
的问题是:
-
如何让学生使用Django ORM代替每组的金额,所以模板将渲染以下信息:
- 组名:兆级书呆子
- 金额的学生:8
- 显示器:李四
...
- 组名:好人
- 金额的学生:11
- 显示器:约翰·苹果核战
- 如何将有关学生数量的数据传递给相应的组。
谢谢。
更新
据@Gocht的建议,我用ManyToManyField,所以我现在models.py
看起来
class Student(models.Model):
student_id = models.IntegerField(primary_key=True)
student_name = models.CharField(max_length=255, default='Василий Пупкин')
dob = models.DateField(max_length=8)
def __str__(self):
return self.student_name
class Group(models.Model):
group_name = models.CharField(max_length=40, primary_key=True)
monitor = models.ForeignKey(Student)
students = models.ManyToManyField(Student, related_name='students')
此外,作为建议,我已经添加了装饰到Group
类:
@property
def get_students_qty(self):
return self.students.all().count()
所以现在我可以得到每个组的学生数量,如下所示:
{% for group in groups %}
<p>{{ group.group_name }}</p>
<p>{{ group.monitor }}</p>
<p>{{ group.get_students_qty }}</p>
{% endfor %}
但我仍然想知道 - 是否有可能在不使用装饰器的情况下获得组的学生人数?毕竟,Group
类有students
场...
答
你可以让学生人数在一组这样的:
group = ... # get a group
n_students = Student_Group.objects.filter(group=group).count()
然后因为每个Student_Group对象有一个学生,n_students
将包含给定组中的学生人数。
要发送该号码到您的模板,你可以在你的情况下添加:
def group_list(request):
groups = Group.objects.all()
return render(request, 'groups/group_list.html', {'groups': groups, 'n_students': n_students})
你也可以看到ManyToMany
关系的文档,可帮助在这里。
编辑
花一些时间来检查Python's naming conventions;您的Student_Group
应该是StudentGroup
。
您可以创建模型中的方法返回一个组中的学生数量:
# models.py
class Group(models.Model):
# fields
@property
def get_students_qty(self):
return self.student_group_set.all().count()
# Try with self.studentgroup_set.all().count() if the line
# above does not work
然后在你的模板:
{% for group in groups %}
<p>{{ group.group_name }}</p>
<p>{{ group.monitor }}</p>
<p>{{ group.get_students_qty }}</p>
{% endfor %}
对不起,我就需要什么还不清楚。我编辑了我的问题,请考虑查看,非常感谢 –
@mr_bulrathi编辑 – Gocht