Атрибут language в первом примере является частью объектов Translation, а во втором - частью Publisher. Кроме того, в первом издатель не имеет собственного текста, но ссылается на M2M на объекты перевода, содержащие текст.
Таким образом, в первом примере вы просите выбрать Издателей, а не Переводы (которые связаны публикацией участника). Так что, если у любого Publisher есть любой объект перевода на запрашиваемом языке, вы получите этот Publisher, а затем, когда вы сделаете что-то вроде pub.publication.all (), он выполнит то, что вы просите: он вернет КАЖДЫЙ объект публикации, связанный с этим издателем на любом языке.
Чтобы исправить первый пример, вам нужно сделать что-то вроде
pub = Translation.objects.filter(language=request.LANGUAGE_CODE)
, если вы просто хотите получить список всех статей на определенном языке, потому что объекты перевода имеют текст и данные языковых настроек, а не издателя.
Если вы хотите получить список всех статей на определенном языке от одного конкретного издателя, добавьте еще одну переменную фильтра, например:
pub = Translation.objects.filter(language=request.LANGUAGE_CODE, publisher=publisher_id)
или каким-либо другим способом, которым вы хотите идентифицировать этого конкретного издателя (а установка related_name = "" - плохая идея, потому что тогда вы вообще не сможете установить обратную связь).
Кроме того, я бы изменил отношение Publisher.publication к ForeignKey, потому что если у вас нет ситуации, когда более одного издателя работают вместе с другим издателем над одной и той же статьей, вам не нужен M2M, вам нужен O2M ( один издатель пишет много публикаций / переводов).