删除 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 admin 在 save_model 方法中删除内联对象