2016-08-04 7 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 %} 

しかし、それはグループごとに学生の量をレンダリングすることになります、私は立ち往生している。代わりに、DjangoのORMを使用して、グループごとに学生の量を取得する方法

  1. 、そのテンプレートは以下となります。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" 
    

    質問がある特定のグループに学生の量をカウントすることができます

    • グループ名:メガオタク
    • 次の情報をレンダリング学生の
    • 量:8
    • モニター:ジョン・ドウ

    ...

    • グループ名:学生のニースみんな
    • 量:11
    • モニター:ジョン・アップルシード
  2. 対応するグループに生徒数に関するデータを渡す方法。

ありがとうございます。

更新

は@Gochtアドバイスによると、私が示唆したように、私はGroupクラスにデコレータを追加しました、私の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') 

ように見えるので、のManyToManyFieldを使用しました

@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関係ドキュメントを、また見ることができました。

EDIT

Python's naming conventionsをチェックするのに時間がかかります。 Student_GroupStudentGroupである必要があります。

あなたは、グループ内の学生の数を返すために、モデル内のメソッドを作成することができます

# 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

関連する問題