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

Posted

技术标签:

【中文标题】django 访问原始多对多创建的表字段【英文标题】:django accessing raw many to many created table fields 【发布时间】:2012-12-27 16:53:06 【问题描述】:

型号:

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。我知道我应该在结果中使用“len”,但我不知道如何访问 subject_id 字段。 使用外键,我在 for 循环中这样做:

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

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

【问题讨论】:

【参考方案1】:

您可以直接访问直通表。

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

【讨论】:

这里有一个关于一个小细节的注释,它可能会在某天为其他读者节省一些时间:Students.subjects.through 有效,但Subjects.student_set.through 无效。从设计的角度来看这是完全可以理解的,但在现实生活中,人们一开始就忘记了哪个是相关集,也不知道错误消息在说什么。

以上是关于django 访问原始多对多创建的表字段的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤和访问 Django QuerySet 中的多对多字段?

在 Django 中为多对多字段冲突反向访问器和查询?

Django:在创建对象时搜索多对多字段

Django多对多关系建立及Form组件

Django

如何以 django 形式过滤多对多字段