2009-11-28 1 views
3

Согласно example, у меня есть три модели:Как удалить экземпляр промежуточной модели в отношениях Django Many-to-many?

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() 

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

AssertionError at /groups/quit/1/

Membership object can't be deleted because its id attribute is set to None.

ответ

17

В строке

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

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

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

m = Membership.objects.get(user=request.user, group=g) 
4

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