9

モデル:

class Subjects (models.Model):
    name = models.CharField(max_length=100)
    places = models.CharField(max_length=100)


class Student (models.Model):
    name = models.CharField(max_length=40)
    lastname = models.CharField(max_length=80)
    subjects = models.ManyToManyField(Subjects, blank=True)

上記のモデルを使用すると、Djangoはappname_student_subjectsを作成します。

appname_student_subjectsテーブルは、たとえば次のようになります。

id   |    student_id   |  subjects_id
-----------------------------------------
1    |    1            |  10
2    |    4            |  11
3    |    4            |  19
4    |    5            |  10
...
~1000

どうすればsubjects_idフィールドにアクセスし、subjects_idが上の表に存在する回数を数えることができますか(そしてそれを使って何かをすることができます)。例:ID 10のサブジェクトが2回存在する場合、テンプレートには2が表示されます。結果に「len」を使用する必要があることはわかっていますが、subject_idフィールドにアクセスする方法がわかりません。外部キーを使用して、forループで次のように実行しています。

results_all = Students.objects.filter(subject_id='10')
result = len(results_all)

結果をテンプレートに渡してforループ内に表示しますが、外部キーではないため、機能しません。

4

1 に答える 1

20

スルーテーブルに直接アクセスできます。

num = (Students.subjects  # M2M Manager
               .through  # subjects_students through table
               .objects  # through table manager
               .filter(student_id=10)  # your query against through table
               .count())
于 2013-01-13T22:50:13.837 に答える