【问题标题】:Django objects.filter() values_list() vs python list comprehension for __in queryDjango objects.filter() values_list() vs python list comprehension for __in query
【发布时间】:2011-06-16 06:29:46
【问题描述】:

我有一个 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列表理解是“要走的路”?

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

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

    【讨论】:

    • 巨大。 values_list 更快。 flat=true 让它更快,因为 python 不需要实例化列表中的所有对象,只返回数据库值。
    • 澄清一下,它更快,因为 Django 认识到我们正在使用查询集作为查询集的参数,因此它将它们组合成一个查询 - 它不会首先评估 values_list 查询集到一个列表!
    【解决方案2】:

    需要注意的一点是,values/values_list 的行为与列表理解有所不同:

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

    选择错误的会导致不必要的数据库命中或不必要的胡闹,这取决于您要执行的操作。

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多