Как удалить один экземпляр промежуточной модели в сквозных отношениях Django? - PullRequest
0 голосов
/ 21 мая 2018

Это отношение M2M, которое имеет промежуточную модель «Членство» (промежуточная модель хранит дополнительную информацию об отношениях между студентом и курсом, используя ключевое слово «through»).В моем случае дополнительные отношения - это оценка, которую студент получает на каждом из своих курсов.МОЯ ПРОБЛЕМА: Я не могу найти способ в 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)

Так как 'Членство' является промежуточной моделью, он отключает функцию remove (), которая была бы доступна в обычных отношениях ManyToMany.

Вы можете использовать метод clear (),но он убрал бы все оценки, которые студент имеет в курсе отношений.Например: если бы «Карлос» был на 5 разных курсах с 5 разными оценками для каждого курса, а также какой-нибудь другой студент, «Мария»

c = курс

  c.members.clear()

очистил бы каждый классотношения.Вы можете увидеть другой пример в документации: https://docs.djangoproject.com/en/2.0/topics/db/models/#extra-fields-on-many-to-many-relationships

И если я попытаюсь использовать метод remove (), я получу ошибку атрибута:

m1 = 'instance of Membership'

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

В администраторе django я могу удалить один 'членский объект' === 'оценка класса', но не могу найти способ удалить его в оболочке или в моем кодекоторый не использует метод clear () (который не работает у меня, потому что очищает все отношения)

Пожалуйста, помогите: ///

1 Ответ

0 голосов
/ 21 мая 2018

Вы должны просто удалить членство.

m1.delete()
...