удаление поля django many_to_many - PullRequest
0 голосов
/ 08 мая 2018

У меня есть две модели django, которые я хочу соединить, используя отношения многие ко многим. Смотрите пример ниже:

class A(models.Model):
    name = models.CharField(max_length=1000, unique=True)

class B(models.Model):
    name = models.CharField(max_length=1000, unique=True)
    aa = models.ManyToManyField(A, related_name='bs', blank=True, null=True)

Что я пытаюсь выяснить, что произойдет, если я удалю запись A или B? Я хочу, чтобы отношения в M2M были удалены, а другой объект остался нетронутым. Скажем, строка в A удалена, тогда соответствующие строки в B должны остаться, только соединение через отношение m2m должно быть удалено. Я не могу найти его в документации по Django.

Ответы [ 2 ]

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

Да, это объясняется в документации .

Вот соответствующая часть:

Если мы удалим публикацию, ее статьи не смогут получить к ней доступ:

p1.delete()
Publication.objects.all() <QuerySet [<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>]>
a1 = Article.objects.get(pk=1)
a1.publications.all()
<QuerySet []>

Если мы удалим статью, ее публикации не смогут получить к ней доступ:

a2.delete()
Article.objects.all()
<QuerySet [<Article: Django lets you build Web apps easily>]>
p2.article_set.all()
<QuerySet []>

В вашем случае Django создаст таблицы для моделей A и B , а также промежуточную таблицу, которая не отражена в моделях. При удалении экземпляра объекта (записи) класса A будет удалена связанная строка в таблице A , а также все связанные строки в промежуточной таблице. Таблица B не будет затронута.

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

Установив отношение m2m, вы в основном создаете еще одну таблицу с внешним ключом для модели A и еще одну для модели B (Django делает это за вас).

По умолчанию on_delete установлено на models.CASCADE, что означает, что если вы удалите строку в любой из этих моделей, отношение также будет удалено. (Вы можете подтвердить это, удалив на своей странице администратора строку, в которой вы увидите сообщение со списком всех отношений, в которых они также будут удалены)

Вы можете самостоятельно создать таблицу для управления этими вещами и подключить эту таблицу к модели с помощью through=. Это хороший способ управлять отношениями m2m так, как вы хотите.

Док: Отношения многие ко многим

...