2016-08-04 107 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