我最近在支持Wagtail的网站上制作了标签云,但是我遇到了一个问题,其中出现了一些仅包含私人文章/页面的标签(在我的网站中称为“主题”)。
到目前为止,我已经做了类似的事情来获取每个标签中的文章数量,并在没有标签的情况下将其过滤掉:
topics_with_articles = Topic.objects.annotate(num_articles=models.Count("articlepage")).filter(num_articles__gt=0)
filtered_topics = topics_with_articles.order_by("-num_articles").values("name", "slug", "num_articles")
我的模型设置如下:
from modelcluster.models import ParentalManyToManyField, ParentalKey
from modelcluster.tags import ClusterTaggableManager
from taggit.models import Tag, TaggedItemBase
@register_snippet
class Topic(Tag):
class Meta:
ordering = ["slug"]
proxy = True
verbose_name = "Topic"
verbose_name_plural = "Topics"
class ArticleTopic(TaggedItemBase):
content_object = ParentalKey("ArticlePage", related_name="article_topics")
class ArticlePage(Page):
topics = ClusterTaggableManager(through="articles.ArticleTopic", blank=True)
我找不到一个简单的解决方案来使它正常工作,那我该怎么办呢?
答案 0 :(得分:1)
Wagtail Slack chat中有人建议使用{} {3}},这是taggit未公开的$_POST['id']
函数的原因,因此我采用了以下解决方案:
most_common
这通过比较articles = ArticlePage.objects.live().public().order_by("-date")
topics_with_filtered_articles = ArticlePage.topics.most_common(min_count=1, extra_filters={'articlepage__in': articles})
和articles
查询集来过滤掉主题中的所有私人和草稿文章。通过添加Articles.objects
参数,还可以过滤掉所有没有文章的主题。
另外,taggit在min_count=1
查询集中添加了num_times
注释,所以我不必自己做!