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 关系的好方法。
是的,在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 将为模型 A 和 B 以及中介 table,这没有反映在模型中。当您删除 class A 的对象实例(一条记录)时,table A 中的关联行将被删除,以及中介 table 中的所有关联行。 table B 不会受到影响。
我有两个 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 关系的好方法。
是的,在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 将为模型 A 和 B 以及中介 table,这没有反映在模型中。当您删除 class A 的对象实例(一条记录)时,table A 中的关联行将被删除,以及中介 table 中的所有关联行。 table B 不会受到影响。