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

时间:2016-02-23 18:52:28

标签: django django-models many-to-many django-orm

我有一个模型在其他模型中用作相关的。 (这个例子只是为了给出模型的概念)

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 个答案:

答案 0 :(得分:0)

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

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()