2011-01-27 60 views
27

我有一个怪癖Django的查询集过滤(?):Django的objects.filter()values_list()与Python列表修真__in查询

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的“路要走”吗?

回答

56

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

+5

是否有性能差异? – Marcin 2011-06-04 10:55:44

2

有一点要注意的是,有价值观的行为差异/从列表理解values_list:

  • 值/ values_list将产生存储在现场的实际值,即,只是如果该值是一个外键,并且在模型中建立了适当的关系,则列表理解将为您提供由外键引用的对象。

选择错误的一个将导致不必要的数据库命中或不必要的拖延,具体取决于您正在尝试执行的操作。