Django - фильтр множества полей - request.LANGUAGE_CODE - PullRequest
1 голос
/ 09 марта 2012

У меня возникла проблема с фильтром и отношением m2m и request.LANGUAGE_CODE.

Если в представлении я использую request.LANGUAGE_CODE в первом примере, запрос возвращает все возможные записи для каждого доступного языка.

В то время как во второй модели все работает отлично.

Пример - не работает:

Модель:

 class Publisher(models.Model):
     publication = models.ManyToManyField('Translation', related_name="")

Вид:

pub = Publisher.objects.filter(publication__language=request.LANGUAGE_CODE)

Пример - работает:

Модель:

class Publisher(models.Model):
    title = models.CharField(max_length=256, verbose_name="Tytuł", blank=True, null=True)
    text = models.TextField(verbose_name="Treść", blank=True, null=True)
    language = models.CharField(max_length=8, choices=settings.LANGUAGES, default=settings.LANGUAGES[1])

Просмотр:

 pub = Publisher.objects.filter(language=request.LANGUAGE_CODE)

Как это работает и как исправить или избежать этой проблемы?

1 Ответ

0 голосов
/ 09 марта 2012

Атрибут 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 ( один издатель пишет много публикаций / переводов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...