Фильтрация личных страниц по тегам - PullRequest
1 голос
/ 19 мая 2019

Недавно я создал облако тегов на своем веб-сайте на платформе 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 Ответ

1 голос
/ 20 мая 2019

Кто-то в чате Wagtail Slack предложил этот ответ на недокументированную функцию most_common taggit, поэтому я применил это решение примерно так:

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.При добавлении параметра min_count=1 все темы без статьи также отфильтровываются.

И в качестве дополнительного бонуса taggit сделал аннотацию num_times в наборе запросов topics_with_filtered_articles, поэтому мне не нужносделай сам!

...