【问题标题】:Django: values_list(flat=True) but for multiple fieldsDjango: values_list(flat=True) 但对于多个字段
【发布时间】:2021-04-19 02:40:04
【问题描述】:

我有一个模特,TestModel

据我所知,如果我要实现

TestModel.objects.values_list('FieldA', flat=True)

这会导致 [A,B,C,(...)](列表)

然后这样做TestModel.objects.values_list('FieldA','FieldB')

产生[(A,1),(B,2),(C,3),(...)](查询集列表)

但是是否有可能获得与Flat=True 类似的结果,但对于多个字段?所以,如果我要使用类似的东西

testQS = TestModel.objects.values_list('FieldA','FieldB')

并调用testQS['FieldA'],这将返回[A,B,C,(...)]

同样,调用testQS['FieldB'] 将返回[1,2,3,(...)]

基本上,我想从values_list 中的某个字段中获取所有数据,其中包含多个 字段,而无需诉诸for loop 或为每个字段多次创建values_list

【问题讨论】:

  • 您不能使用falt=True 调用values_list() 来获取多个字段。
  • 是的,我知道。我认为你没有正确理解这个问题。我没有提及或暗示我在具有多个字段的values_list 中使用flat=True 的任何地方;我知道这是错误的。我想知道并重申,是否有可能使用多个字段与flat=True 获得相似结果。

标签: django django-queryset


【解决方案1】:

您可以使用这种方法:

fields = ['FieldA','FieldB']
testQS = list(TestModel.objects.values_list(*fields))
result = {field:[] for field in fields}
counter = 0
for item in testQS:
    result = {field:[*result[field],item[counter]] for field in fields}
    counter +=1

【讨论】:

  • 我正在寻找的关键想法是没有 for 循环......
【解决方案2】:

您可以使用 itertools 链式方法。它会使您的列表变平。

import itertools

qs = TestModel.objects.values_list('FieldA','FieldB')
qs = list(itertools.chain(*qs))
return qs

【讨论】:

    【解决方案3】:

    您可以使用 TestModel.objects.values_list('FieldA','FieldB', named=True)

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2017-07-22
      • 2019-01-22
      • 2013-04-18
      • 2011-02-05
      • 1970-01-01
      • 2017-03-07
      • 2013-04-27
      相关资源
      最近更新 更多