【问题标题】:Passing several arguments for rendering template为渲染模板传递几个参数
【发布时间】: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"

问题是:

  1. 如何使用 Django ORM 获取每个组的学生数量,因此模板将呈现以下信息:

    • 组名:Mega nerds
    • 学生人数:8人
    • 班长:John Doe

    ...

    • 组名:好人
    • 学生人数:11人
    • 班长:John Appleseed
  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 字段...

【问题讨论】:

    标签: python django


    【解决方案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 %}
    

    【讨论】:

    • 抱歉,我不清楚需要什么。我已经编辑了我的问题,请考虑查看它,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多