在Django中有效删除孤立的m2m对象/标签

Sim*_*ger 5 django many-to-many orphaned-objects orphan

我有两个模型 - 照片和标签 - 通过ManyToManyField连接.

class Photo(models.Model):
    tags = models.ManyToManyField(Tag)

class Tag(models.Model):
    lang = models.CharField(max_length=2)
    name_es = models.CharField(max_length=40)
    name_en = models.CharField(max_length=40)
Run Code Online (Sandbox Code Playgroud)

每隔一段时间,我们就会获得孤立的标签,任何照片都不会引用这些标签.是否有一种删除这些标签的有效方法?我知道这个答案: Django:删除M2M孤儿条目?

我们的解决方案目前看起来像这样:

for tag in Tag.objects.all():
    if not tag.photo_set.select_related(): tag.delete()
Run Code Online (Sandbox Code Playgroud)

然而,随着数据库,该脚本的运行变得令人不安的高:-P有正从标签表中的所有标签ID的列表的有效方式,然后从所有的标签ID的列表许多一对多表创建一个交集列表?

okm*_*okm 4

尝试使用中间表进行子查询

qs = Tag.objects.exclude(pk__in=Book.tags.through.objects.values('tag'))

# then you could
qs.delete()

# or if you need to trigger signal per item
for x in qs:
    x.delete()
Run Code Online (Sandbox Code Playgroud)