【发布时间】:2013-01-16 08:10:48
【问题描述】:
我想从 django 的查询中检索一个字段的所有值的列表。例如,我有一个用户查询,而不是用户对象的查询集(或列表),我想要一个仅包含用户名(字符串)的列表。从某种意义上说,这是要求仅限于一列数据。
【问题讨论】:
标签: django
我想从 django 的查询中检索一个字段的所有值的列表。例如,我有一个用户查询,而不是用户对象的查询集(或列表),我想要一个仅包含用户名(字符串)的列表。从某种意义上说,这是要求仅限于一列数据。
【问题讨论】:
标签: django
获取用户名列表:
>>> 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']
【讨论】:
usr_names = list(User.objects.all().values_list('username',flat=True))
你试过了吗
list(User.objects.all().values_list('username', flat=True))
如果只传入单个字段,也可以传入flat参数。如果为 True,这将意味着返回的结果是单个值,而不是一个元组。此外,将其转换为列表会使返回的值成为列表而不是查询集
【讨论】:
User 对象的东西中获取所有字段的列表。我把它放进去,得到一个django.core.exceptions.FieldError: Cannot resolve keyword '' into field. Choices are: 错误,但仍然显示该模型的所有不同字段......我会尽我所能。
正如你所写:
“而不是用户对象的查询集(或列表)”
上面的解决方案仍然是查询集
usr_names = User.objects.all().values_list('username')
这个解决方案:
usr_names = [str(elem) for elem in list(User.objects.all().values_list('username'))]
它将返回一个字符串列表
【讨论】:
获取属性对象列表的最简单方法是首先使用 values_list 单独获取该属性的查询集,然后使用 set() 将 django 查询集转换为 python 集,最后转换为使用list() 的列表。
在你的场景中:
user_names = list(set(User.objects.all().values_list('username', flat=True)))
【讨论】: