【问题标题】:Extract values from Django <QuerySet> in Python 3在 Python 3 中从 Django <QuerySet> 中提取值
【发布时间】:2020-01-19 16:14:35
【问题描述】:

我有一些python代码:

UnitTestCollection.objects.filter(unit__type=unit_type)

以格式输出数据:

<QuerySet [<UnitTestCollection: VALUE1>, <UnitTestCollection: VALUE2>...

如何仅提取值列表,即

[VALUE1, VALUE2....]

【问题讨论】:

  • 您得到的输出是UnitTestCollection 的实例列表。例如,您可以遍历查询集并打印您想要的任何字段。但如果您只想让查询集获取特定字段,qs.values_list('field', flat=True) 将只返回该值列表。

标签: django python-3.x list object filter


【解决方案1】:

为什么不是简单的列表推导?

qs = UnitTestCollection.objects.filter(unit__type=unit_type)
my_values = [item.field_name for item in qs]

或者使用 values_list() 直接在查询集中获取每个项目的特定字段,具有惰性评估的优势:

qs = UnitTestCollection.objects.filter(unit__type=unit_type)\
                               .values_list('field_name', flat=True)

【讨论】:

  • qs 的输出已经是值列表(您已将其展平),因此item.field_name 将抛出错误。
  • 我记得它,因为它仍然是一个只有给定字段的 QS 和模型对象,但显然它确实是一个查询集,但根本不是模型对象。谢谢!
【解决方案2】:

values_list 比列表理解更好,因为查询集是惰性求值的。在您真正需要它们之前,它们不会被执行。

queryset = UnitTestCollection.objects.filter(unit__type=unit_type).values_list('<insert field>', flat=True)

这将返回[field1, field2, field3...]

如果你使用.values('&lt;insert field&gt;'),你会得到[{field: field value1}, {field: field value2}, {field: field value3}...]

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 2020-11-29
    • 2020-08-06
    • 1970-01-01
    • 2021-05-06
    • 2010-11-25
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多