いくつかのオブジェクトの ID を取得したい。それらをタプルに入れるきれいな方法は何ですか?
.values() クエリセットはこれを返します:
MyModel.objects.filter(name__startwith='A').values('id')
>>>> [{'id': 20L}, {'id': 21L}, {'id': 84L}]
そして、私はそれらを次のようなタプルに変換/取得したいと思います:
(20L, 21L, 84L)
最も簡単な解決策は、取得values_list
することですflat=True
models.MyModel.objects.all().values_list('id', flat=True)
これは values() に似ていますが、繰り返し処理すると辞書を返す代わりにタプルを返す点が異なります。各タプルには、values_list() 呼び出しに渡されたそれぞれのフィールドからの値が含まれます。したがって、最初の項目が最初のフィールドになります。
1 つのフィールドのみを渡す場合は、flat パラメーターを渡すこともできます。True の場合、返される結果が 1 つのタプルではなく単一の値であることを意味します。例は違いをより明確にするはずです:
ジェネレータ式はどうですか?
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')))