django many_to_many 字段删除

django many_to_many field deletion

我有两个 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 文档中找不到它。

通过建立 m2m 关系,您基本上是在建立另一个 table,其中一个外键指向模型 A,另一个外键指向模型 B(Django 为您完成)。

默认情况下 on_delete 设置为 models.CASCADE,这意味着如果您删除任何这些模型中的一行,关系也将被删除。 (您可以通过删除管理页面中的一行来确认,您会看到一条消息,其中包含所有关系的列表,它们也将被删除)

您可以自己制作一个 table 来管理这些东西,并将 table 连接到具有 through= 的模型。这是以您真正想要的方式管理 m2m 关系的好方法。

文档:Many-to-many relationships

是的,在documentation中有说明。

相关部分如下:

If we delete a Publication, its Articles won’t be able to access it:

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 []>

If we delete an Article, its Publications won’t be able to access it:

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

在您的情况下,Django 将为模型 AB 以及中介 table,这没有反映在模型中。当您删除 class A 的对象实例(一条记录)时,table A 中的关联行将被删除,以及中介 table 中的所有关联行。 table B 不会受到影响。