Django - Как сделать запрос к связанной переведенной модели?

У меня есть две модели, которые во многом связаны между собой. Модели статей и тегов. Обе являются TranslateableModel с использованием django-parler.

Я хотел бы получить все теги вместе с 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=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)
    )
)
Вернуться на верх