【发布时间】:2016-08-04 14:25:32
【问题描述】:
首先,请原谅我的英语 - 它不是我的母语。
我有以下型号:
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 获取每个组的学生数量,因此模板将呈现以下信息:
- 组名:Mega nerds
- 学生人数:8人
- 班长:John Doe
...
- 组名:好人
- 学生人数:11人
- 班长:John Appleseed
- 如何将有关学生数量的数据传递给相应的组。
谢谢。
更新
根据@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 字段...
【问题讨论】: