django - 高效删除 Django 中孤立的 m2m 对象/标签

标签 django many-to-many orphan orphaned-objects

我有两个模型 - 照片和标签 - 通过 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)

每隔一段时间,我们就会得到孤立的标签,这些标签不再被任何照片引用。有没有有效的方法来删除这些标签?我知道这个答案: Django: delete M2M orphan entries?

我们的解决方案目前如下所示:

for tag in Tag.objects.all():
    if not tag.photo_set.select_related(): tag.delete()

然而,随着数据库的增加,这个脚本的运行时间变得令人痛苦地高:-P 有没有一种有效的方法从标签表中获取所有标签 ID 的列表,然后从许多- 中获取所有标签 ID 的列表多对表来创建交集列表?

最佳答案

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

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

关于django - 高效删除 Django 中孤立的 m2m 对象/标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609699/

相关文章:

python - Django celery ,导入错误 : Import by filename is not supported

database - Postgresql:在多对多关系中使用数组而不是额外的表?

HTML 条件分页符

django - 将Selenium与Pytest结合使用以在Docker中运行的Django 2.2项目

python - OperationalError,没有这样的列。 Django

ruby-on-rails - 使用 CanCan 授权基于多对多关联的资源

java - 使用 Hibernate Criteria 查询 ManyToMany 关系

ruby-on-rails - 在 Rails 3 中通过关联使用 has_many 防止孤立对象

linux - Ubuntu 16.04 显示孤儿进程的父 ID 4147

python - 如何在 django 模板中从外部 url 插入 html 代码?