Как удалить ТОЛЬКО м2м отношения? - PullRequest
3 голосов
/ 09 марта 2011

модель:

class Province(models.Model):
    user = models.ManyToManyField(User, blank=True)
    name = models.CharField(max_length=30, unique=True)

class City(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, editable=False, unique=False)
    ownership = models.ManyToManyField(User, through='UserCity')


class UserCity(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)
    city = models.ForeignKey(City)


class District(models.Model):
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True, editable=False)
    ownership = models.ManyToManyField(User, through='UserDistrict')

class UserDistrict(models.Model):
    user = models.ForeignKey(User)
    province = models.ForeignKey(Province)
    city = models.ForeignKey(City)
    district = models.ForeignKey(District)

Как удалить связь, когда я знаю user_id и провинция_id?Если я пользователь delete (), он также удаляет провинцию, и я хочу избежать этого.Я нигде не могу найти, как удалить 1 конкретное отношение в поле m2m.

Ответы [ 3 ]

10 голосов
/ 09 марта 2011

Используйте метод удаления на вашем ManyToMany менеджере.

Province.objects.get(id=3).user.remove(user_id)

Вы также можете получить прямой доступ к сквозной таблице, если хотите:

Province.user.through.objects.get(province__id=3, user__id=4).delete()
1 голос
/ 09 марта 2015

Я знаю, что этот вопрос старый ... Если вы хотите удалить все users определенного province:

province.user.clear()
1 голос
/ 13 ноября 2012

Если вам нужно удалить только связь для всех экземпляров между двумя моделями, вы можете сделать это, открыв диспетчер таблицы взаимосвязей.Доступ к таблице отношений m2m можно получить через MyModel.relations.through, поэтому для удаления связей это становится легко:

MyModel.relations.through.objects.all().delete()

ссылка:

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ManyToManyField.through

...