我有两个模型是很多很多相关的。文章和标签模型。两者都是使用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,我希望他们看到标记以及为该标记用英语编写的文章的数量。可能有10篇文章,但只有7篇被翻译成英文。
我拥有的是这样的东西:
Tag.objects.translated()
.annotate(articles_count=(Count("articles__translations")))但这给了我翻译的总数。如果一篇文章在英语和法语中同时存在,它就会有双倍的数字。
我如何制作它,使它给我的文章数,仅以当前语言在一个给定的标签?
发布于 2021-09-20 09:30:35
您可以在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)
)
)这将只保留完全相同语言代码的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=Q(articles__translations__language_code__istartswith=language)
)
)https://stackoverflow.com/questions/69251496
复制相似问题