从标签中过滤出私人页面

时间:2019-05-19 16:40:14

标签: django wagtail django-taggit

我最近在支持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)

我找不到一个简单的解决方案来使它正常工作,那我该怎么办呢?

1 个答案:

答案 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注释,所以我不必自己做!