Django objects.filter()values_list()vs __inin查询的python list comprehension

Dar*_*ryl 28 python django django-models django-queryset

我有一个Django查询集过滤的怪癖(?):

ipdb> MagazineIssue.objects.filter(id__in=l_magazines.values_list('id'))
Out[0]: []
Run Code Online (Sandbox Code Playgroud)

要么

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

ipdb> l_magazines.values_list('id')
Out[0]: [(1,)]
ipdb> [l_magazine.id for l_magazine in l_magazines]
Out[0]: [1]
Run Code Online (Sandbox Code Playgroud)

那么,如何使用values_list()?(生产):

[1]
Run Code Online (Sandbox Code Playgroud)

或是python列表理解'走的路'?

Clo*_*ans 58

试试l_magazines.values_list('id', flat=True).这将返回一个id列表,而不是单个id元组列表.

  • 巨大.values_list更快.flat = true使得它更快,因为python不需要实例化列表中的所有对象,只返回数据库值. (3认同)
  • 澄清一下,它更快,因为 Django 认识到我们使用查询集作为查询集的参数,因此它将它们组合成一个查询 - 它不会首先将“values_list”查询集评估为列表! (2认同)