Как реализовать m2m_changed? - PullRequest
       32

Как реализовать m2m_changed?

0 голосов
/ 09 декабря 2018

По сути, мой вопрос заключается в том, как мне реализовать m2m_changed, чтобы при создании, обновлении или удалении экземпляра ClassSubjectGrade также обновлялась промежуточная таблица между ClassSubjectGrade и Student.Пример:

  1. Добавление большего количества учеников при редактировании экземпляра ClassSubjectGrade добавит учеников, связанных с промежуточной таблицей

  2. Удаление учеников из экземпляраClassSubjectGrade удалит тех учеников, которые связаны с промежуточной таблицей

  3. Удаление экземпляра ClassSubjectGrade удалит всех учеников, связанных с этим экземпляром

Я разместилмой код ниже, но я также не уверен, стоит ли мне проверять эти 2 действия или есть простой способ сделать это.Я также не вижу в документации того, как писать код, чтобы делать то, что я хочу, всякий раз, когда я делаю 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
...