基本上,我的问题是如何实现m2m_changed,以便在创建,更新或删除ClassSubjectGrade的实例时,ClassSubjectGrade和Student之间的中间表也会更新 . 例:

  • 在编辑ClassSubjectGrade实例时添加更多学生将添加与中间表关联的学生

  • 从ClassSubjectGrade实例中删除学生将删除与中间表关联的学生

  • 删除ClassSubjectGrade的实例将删除与该实例关联的所有学生

我把我的代码放在下面,但我不确定是否应该检查这两个动作,或者有一个简单的方法来做到这一点 . 我不会在文档中提到如何编写代码来执行我想要的事情,只要我在做上面的3个示例 .

class Student(models.Model):
# some fields

class ClassSubjectGrade(models.Model):
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    # other fields
    students = models.ManyToManyField(Student, blank=True)

from django.db.models.signals import m2m_changed

@receiver(m2m_changed, sender=ClassSubjectGrade.students.through)
def students_changed(sender, instance, action, **kwargs):
    if action == 'post_remove':
        # How to remove all instances in intermediate table of 
        # ClassSubjectGrade and Student
        # of all students that were removed from a ClassSubjectGrade 
        # instance?
    if action == 'post_save':
        # How to add instances in intermediate table of ClassSubjectGrade 
        # and Student
        # of all students that were added from a ClassSubjectGrade instance?

class StudentGrade(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    class_subject = models.ForeignKey(ClassSubjectGrade, 
        on_delete=models.CASCADE)
    # some fields