Подтвердить что ты не робот

Django objects.filter() values_list() vs определение списка python для __in запроса

У меня есть quirk (?) с фильтрацией запросов 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]

или понимает ли список python "способ пойти"?

4b9b3361

Ответ 1

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

Ответ 2

Следует отметить, что существует разница в поведении значений /values _list из понимания списка:

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

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