如何在Django多对多(通过)关系中删除中间模型的单个实例?

时间:2018-05-21 16:02:36

标签: django django-models django-templates django-views

这是一种M2M关系,其中间模型为“会员”(中间模型使用“通过”关键字存储有关学生与课程之间关系的额外信息)。在我的情况下,额外的关系是学生在每门课程中的成绩。我的问题是:我无法在django中找到一种方法来删除/删除其中一门课程与学生的成绩之间的关系。

class Student(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Course(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Student, through='Membership')

    def __str__(self):
        return self.name

class Membership(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    group = models.ForeignKey(Course, on_delete=models.CASCADE)
    grade = models.CharField(max_length=64)

由于'Membership'是一个中间模型,它会禁用remove(),这在普通的ManyToMany关系中是可以访问的。

您可以使用clear()方法,但他会删除学生在课程关系中的每个年级。例如:如果'Carlos'在5门不同的课程中,每门课程有5个不同的成绩,还有一些其他学生'Maria'

c =课程

  c.members.clear()

会清除每个年级的关系。您可以在文档中看到另一个示例: https://docs.djangoproject.com/en/2.0/topics/db/models/#extra-fields-on-many-to-many-relationships

如果我尝试使用remove()方法,我会收到一个属性错误:

m1 ='会员资格的实例'

m1.remove()
AttributeError: 'Membership' object has no attribute 'remove'

在django管理员中,我能够删除一个“会员对象”==='等级关系',但我无法找到一种方法将其删除在shell或我的代码上不使用clear()方法(它不适合我,因为它清除了每个关系)

请帮助:///

1 个答案:

答案 0 :(得分:0)

您应该删除会员资格。

m1.delete()