Django objects.filter () values_list () против понимания списка Python для запроса __in - PullRequest
28 голосов
/ 27 января 2011

У меня есть странность (?) С фильтрацией наборов запросов Django:

ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id'))
Out[0]: []

или

ipdb> MagazineIssue.objects.filter(id__in=[l_magazine.id for l_magazine in l_magazines])
Out[0]: [<MagazineIssue: Architecture Australia, Jan 1995 (#1)>]

и

ipdb> l_magazines.values_list('id')
Out[0]: [(1,)]
ipdb> [l_magazine.id for l_magazine in l_magazines]
Out[0]: [1]

, поэтому, как использовать values_list()?(чтобы произвести):

[1]

или понимание списка питонов - это путь?

Ответы [ 2 ]

58 голосов
/ 27 января 2011

Попробуйте l_magazines.values_list('id', flat=True).Это возвращает список идентификаторов вместо списка одиночных кортежей идентификаторов.

2 голосов
/ 04 июня 2011

Следует отметить, что поведение values ​​/ values_list отличается от понимания списка:

  • values ​​/ values_list выдаст фактическое значение, хранящееся в поле, то есть только идентификатор (не весь объект)
  • если значение является внешним ключом, и в вашей модели настроены соответствующие отношения, то понимание списка даст вам объект, на который ссылается внешний ключ.

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

...