1

我想获取一些对象的 ID。将它们放入元组的干净方法是什么?

.values() 查询集返回:

MyModel.objects.filter(name__startwith='A').values('id')
>>>> [{'id': 20L}, {'id': 21L}, {'id': 84L}]

我想将它们转换/得到一个元组,如:

(20L, 21L, 84L)
4

2 回答 2

4

values_list最简单的解决方案是获得flat=True

models.MyModel.objects.all().values_list('id', flat=True)

这类似于 values() ,只是它不是返回字典,而是在迭代时返回元组。每个元组都包含传递给 values_list() 调用的各个字段的值——因此第一项是第一个字段,依此类推。

如果只传入单个字段,也可以传入 flat 参数。如果为 True,这将意味着返回的结果是单个值,而不是一个元组。一个例子应该使差异更清楚:

于 2013-10-31T12:32:29.897 回答
2

生成器表达式呢?

tuple(d['id'] for d in MyModel.objects.filter(name__startwith='A').values('id'))

或者:

import operator
tuple(map(lambda x: operator.getitem(x, 'id'), MyModel.objects.filter(name__startwith='A').values('id'))

或者,作为因某种原因被删除的答案,您可以这样做:

tuple(object.id for object in MyModel.objects.filter(name__startwith='A'))

或者:

import operator
getter = operator.attrgetter('id')
tpl = tuple(map(getter, MyModel.objects.filter(name__startwith='A')))
于 2013-10-31T12:17:57.467 回答