Django - 如何查询相关的翻译模型?

Django - How to query a related translated model?

我有两个多对多相关的模型。文章和标签模型。两者都是使用 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),
    )

我想获取所有标签以及当前语言的 articles_count。

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

我的是这样的:

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

但这给了我总翻译数。如果一篇文章既有英文版又有法文版,则计为双倍。

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

您可以过滤 language_code,因此:

from django.utils.translation import get_language

language = get_language()

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

这只会保留具有完全相同语言代码的 articles。这意味着如果语言是 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=<strong>Q(articles__translations__language_code__istartswith=language)</strong>
    )
)