1

我有两个多对多相关的模型。文章和标签模型。两者都是使用 django-parler 的 TranslateableModel。

models.py

class Article(BaseModelMixin, TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField(max_length=255),
        short_description=models.CharField(max_length=255),
        body=HTMLField(),
        slug=models.SlugField(max_length=255, blank=True, null=True, unique=True),
    ),
    tags = models.ManyToManyField("Tag", related_name="articles")


class Tag(TranslatableModel):
    translations = TranslatedFields(
        slug=models.SlugField(max_length=55, blank=True, null=True),
        name=models.CharField(_("Tag name"), max_length=50),
    )

我想获取当前语言的所有标签和文章计数。

例如,如果用户访问该页面/en/blog,我希望他们看到标签以及该标签的英文文章数量。对于 django 之类的东西Django (7 articles), Ruby on rails (4 articles)可能有 10 篇文章,但只有 7 篇被翻译成英文。

我所拥有的是这样的:

Tag.objects.translated()
           .annotate(articles_count=(Count("articles__translations")))

但这给了我总翻译的数量。如果一篇文章同时以英文和法文存在,则计为双倍。

我怎样才能使它在给定标签中只给我当前语言的文章数量?

4

1 回答 1

2

您可以过滤language_code,所以:

from django.utils.translation import get_language

language = get_language()

Tag.objects.annotate(
    articles_count=Count(
        'articles__translations', 
        filter=Q(articles__translations__language_code__iexact=language)
    )
)

这只会保留articless 具有完全相同的语言代码。因此,这意味着如果语言是en-US,它不会被认为en是有效的。

您可以只保留语言而不是国家,然后过滤:

# culture-invariant languages

from django.utils.translation import get_language

language = get_language().split('-', 1)[0]

Tag.objects.annotate(
    articles_count=Count(
        'articles__translations', 
        filter=Q(articles__translations__language_code__istartswith=language)
    )
)
于 2021-09-20T09:30:35.533 回答