获取字段查询值的元组

时间:2013-10-31 12:16:09

标签: python django

我想得到一些对象的ID。将元组置于元组中的干净方法是什么?

.values()queryset返回:

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

我想将它们转换成一个元组,如:

(20L, 21L, 84L)

2 个答案:

答案 0 :(得分:4)

最简单的解决方案是使用values_list

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

这类似于values(),除了返回字典而不是返回字典时,它会在迭代时返回元组。每个元组包含传递给values_list()调用的相应字段的值 - 因此第一个项目是第一个字段,等等。

     

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

答案 1 :(得分: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')))