首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -如何查询相关的已翻译模型?

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

Stack Overflow用户
提问于 2021-09-20 08:45:39
回答 1查看 578关注 0票数 1

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

models.py

代码语言:javascript
复制
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篇被翻译成英文。

我拥有的是这样的东西:

代码语言:javascript
复制
Tag.objects.translated()
           .annotate(articles_count=(Count("articles__translations")))

但这给了我翻译的总数。如果一篇文章在英语和法语中同时存在,它就会有双倍的数字。

我如何制作它,使它给我的文章数,仅以当前语言在一个给定的标签?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-20 09:30:35

您可以在language_code上进行筛选,因此:

代码语言:javascript
复制
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是有效的。

您可以只保留语言,而不能保留国家,然后使用以下内容进行过滤:

代码语言:javascript
复制
# 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)
    )
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69251496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档