django访问原始的多个创建的表字段

Chr*_*ris 8 django django-templates django-models django-views

模型:

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)
Run Code Online (Sandbox Code Playgroud)

当我使用上面的模型时,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
Run Code Online (Sandbox Code Playgroud)

如何访问subjects_id字段并计算上表中subject_id存在的次数(然后使用它执行某些操作).例如:如果id为10的主题存在两次模板显示2.我知道我应该使用"len"结果,但我不知道如何访问subject_id字段.使用外键我在for循环中这样做:

results_all = Students.objects.filter(subject_id='10')
result = len(results_all)
Run Code Online (Sandbox Code Playgroud)

然后我将结果传递给模板并在for循环中显示它,但它不是外键,所以它不起作用.

Yuj*_*ita 17

您可以直接访问直通表.

num = (Students.subjects  # M2M Manager
               .through  # subjects_students through table
               .objects  # through table manager
               .filter(student_id=10)  # your query against through table
               .count())
Run Code Online (Sandbox Code Playgroud)

  • 这里有一个关于小细节的注释,有一天可能会节省其他读者的时间:“Students.subjects.through”可以工作,但“Subjects.student_set.through”不起作用。从设计的角度来看,这是完全可以理解的,但在现实生活中,人们首先忘记了哪个是相关的集合,并且不知道错误消息在说什么。 (2认同)