删除 django 模型中不相关的对象(manytomanyfield)

Posted

技术标签:

【中文标题】删除 django 模型中不相关的对象(manytomanyfield)【英文标题】:Delete the not related objects in a django model (manytomanyfield) 【发布时间】:2016-06-05 18:38:57 【问题描述】:

我有一个用于其他相关模型的模型。 (示例只是为了给出模型的概念)

class A(Models.model):
     locations = models.manytomanyfield(Location)

class B(Models.model):
      location = models.foreignkeyfield(Location)

class Location(Models.model):
      foo = models.charfield(...)

现在我想删除所有与A和B无关的位置实例。对于B类中的foreignkeyfield使用filter()很容易,但是对于A类中的manytomany字段,我想知道是否有一种直接查询连接映射的方法。

如果我是对的,连接图应该是 A.locations.through,我如何使用 Django ORM 查询该表中的位置?也许有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

我们从模型 A 和 B 中获取实际位置,然后从 ids 中进行设置,然后在 Location 模型中删除所有未使用的位置。

set_a = set(A.objects.all().values_list('locations', flat=True)
set_b = set(B.objects.all().values_list('locations', flat=True)
locations = set_a | set_b
locations.discard(None)
Location.objects.filter(~Q(id__in=locations)).delete()

【讨论】:

以上是关于删除 django 模型中不相关的对象(manytomanyfield)的主要内容,如果未能解决你的问题,请参考以下文章

django-模型层(model)-多表相关操作(图书管理练习)

通过 Django admin 删除对象时是不是可以禁用相关对象的生成?

Django 保存对象“收据”

django admin 在 save_model 方法中删除内联对象

在 django 中删除 ForeignKey 时在相关模型上发出信号

django 多对多关系:如何删除项目但不从相关模型中删除它们