Как мне удалить экземпляр промежуточной модели в отношении Джанго «многие ко многим»? - PullRequest
4 голосов
/ 28 ноября 2009

Согласно примеру , у меня есть три модели:

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

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

class Membership(models.Model):
    person = models.ForeignKey(User)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()

Добавление участников работает. Но как мне удалить один экземпляр членства (пользователь выходит из группы), не удаляя ни пользователя, ни группу?

Когда я пытаюсь удалить его так:

    u = User(request.user)
    g = Group.objects.get(id=group_id, membership__user=u)
    m = Membership(user=request.user, group=g)
    m.delete()

Я получаю сообщение об ошибке:

Ошибка Assertion в / groups / quit / 1 /

Объект членства не может быть удален, поскольку его атрибут id установлен в Ни один.

Ответы [ 2 ]

17 голосов
/ 28 ноября 2009

В строке

m = Membership(user=request.user, group=g)

Вы создали новый Membership, но вы не получили его из базы данных. Вот почему его атрибут id имеет значение None.

Возможно, вы имели в виду

m = Membership.objects.get(user=request.user, group=g)
4 голосов
/ 28 ноября 2009

Эта конкретная ошибка вызвана тем фактом, что ваш m экземпляр класса Membership не сохранен, поэтому его первичным ключом является None. По-видимому, невозможно удалить такой несохраненный экземпляр (что имеет смысл, поскольку нечего «удалять»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...