Django-taggit教程:如何筛选仅已发布文章的所有标签
仅获取已发布文章标签的解决方法
你当前的Tag.objects.filter()会返回系统里所有标签,不管关联的文章是已发布还是草稿。要筛选只属于已发布文章的标签,试试下面两种方法:
方法一:通过中间表关联过滤
Django-taggit用TaggedItem作为标签和文章的中间关联表,咱们可以通过它关联到已发布的文章:
from taggit.models import TaggedItem published_posts = Post.published.all() # 过滤出关联到已发布文章的标签,distinct()避免重复返回同一个标签 tags = Tag.objects.filter(taggit_taggeditem_items__content_object__in=published_posts).distinct()
方法二:从已发布文章反向提取标签
直接从已发布文章集合里提取所有关联的标签:
published_posts = Post.published.all() # 如果只需要标签名称 tags = published_posts.values_list('tags__name', flat=True).distinct() # 如果需要完整的Tag对象 tags = Tag.objects.filter(pk__in=published_posts.values_list('tags__pk', flat=True)).distinct()
注意点
- 确保你的
Post.published管理器确实能筛选出状态为「已发布」的文章,这部分你已经实现了。 - 两种方法都能达到目的,选哪种看你实际需求:是要完整的Tag对象,还是只需要标签名称,或者哪种写法更贴合你的代码风格。
内容的提问来源于stack exchange,提问作者Diaku Zena
相关产品推荐
相关产品推荐

