【问题标题】:Better way to delete unused tag. / django taggit python删除未使用标签的更好方法。 / django taggit python
【发布时间】:2019-12-28 19:12:19
【问题描述】:

嗨,我是 python django 初学者。

我正在创建一个简单的博客

我想删除在删除帖子时未使用的标签

class Post(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField(max_length=500)
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)
    tags = TaggableManager(blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='owner', blank=True, null=True)
class PostDelete(WriterCheckMixin, DeleteView):
    model = Post
    success_url = reverse_lazy('blog:list')

    def delete(self, request, *args, **kwargs):    
        temp = Post.objects.get(pk=kwargs['pk'])
        for tag in temp.tags.all():
            if tag.taggit_taggeditem_items.count() <= 1:
                tag.delete()
        return super().delete(request, *args, **kwargs)

我只是按照教程,所以不知道 DeleteView 后面发生了什么。

它按预期工作,但似乎效率低下。

我需要“temp = Post.objects.get(pk=kwargs['pk'])”吗?

请给我建议。

【问题讨论】:

    标签: python django django-taggit


    【解决方案1】:

    您可以使用以下命令删除未使用的标签:

    from django.db.models import Count
    from taggit.models import Tag
    
    class PostDelete(WriterCheckMixin, DeleteView):
        model = Post
        success_url = reverse_lazy('blog:list')
    
        def delete(self, request, *args, **kwargs):
            try:
                return super().delete(request, *args, **kwargs)
            finally:
                Tag.objects.annotate(
                    ntag=Count('taggit_taggeditem_items')
                ).filter(ntag=0).delete()

    这将因此注释查询集,并删除没有相关项目的标签。

    话虽如此,我不确定您本身为什么需要删除未使用的标签。您可以决定只渲染 具有一项的标签。但是在数据库中存储标签,通常不会导致大量磁盘使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多