2016-08-04 76 views
0

首先,让我原谅我的英语 - 这不是我的母语。传递模板的几个参数

我有以下型号:

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" 

的问题是:

  1. 如何让学生使用Django ORM代替每组的金额,所以模板将渲染以下信息:

    • 组名:兆级书呆子
    • 金额的学生:8
    • 显示器:李四

    ...

    • 组名:好人
    • 金额的学生:11
    • 显示器:约翰·苹果核战
  2. 如何将有关学生数量的数据传递给相应的组。

谢谢。

更新

据@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场...

回答

1

你可以让学生人数在一组这样的:

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 %} 
+0

对不起,我就需要什么还不清楚。我编辑了我的问题,请考虑查看,非常感谢 –

+0

@mr_bulrathi编辑 – Gocht