45

我想从 django 的查询中检索一个字段的所有值的列表。例如,我有一个用户查询,而不是用户对象的查询集(或列表),我想要一个仅包含用户名(字符串)的列表。从某种意义上说,这是要求仅限制一列数据。

4

4 回答 4

71

你有没有尝试过

list(User.objects.all().values_list('username', flat=True)) 

如果只传入单个字段,也可以传入 flat 参数。如果为 True,这将意味着返回的结果是单个值,而不是一个元组。此外,将其转换为列表会使返回的值成为列表而不是查询集

于 2013-02-01T04:12:01.433 回答
13

要获取用户名列表:

>>> User.objects.all().values('username')
>>> [{'username': u'u1'}, {'username': u'u2'}]

>>> User.objects.all().values_list('username')
>>> [(u'u1',), (u'u2',)]

如果你只想要字符串,列表推导可以解决问题:

>>> usr_names = User.objects.all().values('username')
>>> [u['username'] for u in usr_names]
>>> [u'u1', u'u2']

使用values_list

>>> usr_names = User.objects.all().values_list('username')
>>> [u[0] for u in usr_names]
>>> [u'u1', u'u2']
于 2013-02-01T03:14:14.993 回答
2

正如你所写:

“而不是用户对象的查询集(或列表)”

上面的解决方案仍然是查询集

usr_names = User.objects.all().values_list('username')

这个解决方案:

usr_names = [str(elem) for elem in list(User.objects.all().values_list('username'))]

它将返回一个字符串列表

于 2019-08-26T14:42:09.397 回答
2

获取属性对象列表的最简单方法是首先单独使用获取该属性的查询集,values_list然后使用将 django 查询集转换为 python 集set(),最后使用list().

在您的场景中:

user_names = list(set(User.objects.all().values_list('username', flat=True)))
于 2021-04-27T10:38:28.673 回答