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

时间:2011-01-27 01:10:41

标签: python django django-models django-queryset

我有一个带有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 list comprehension'走的路'?

2 个答案:

答案 0 :(得分:58)

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

答案 1 :(得分:2)

需要注意的一点是,值/ values_list与列表理解的行为存在差异:

  • values / values_list将产生存储在字段中的实际值,即只是id(不是整个对象)
  • 如果值是外键,并且您在模型中设置了适当的关系,则列表推导将为您提供外键引用的对象。

选择错误的一个会导致不必要的数据库命中,或者不必要的操作,这取决于你想要做什么。