Efficiently delete orphaned m2m objects/tags in Django

前端 未结 3 1540
遇见更好的自我
遇见更好的自我 2021-01-05 17:06

I have two models - Photo and Tag - which are connected via a ManyToManyField.

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

class Tag(m         


        
3条回答
  •  春和景丽
    2021-01-05 17:48

    We've had to further improve performance of this task, so I modified okm's solution a bit:

        all_tag_pks = Tag.objects.values_list('pk', flat=True)
        used_tag_pks = Photo.tags.through.objects.values_list('tag', flat=True)
        Tag.objects.filter(pk__in=list(set(all_tag_pks) - set(used_tag_pks))).delete()
    

    By that, the query to the database gets a lot smaller and faster.

提交回复
热议问题