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