2022年10月5日水曜日

Django: QuerySetに対するvalues()とvalues_list()の使い方と結果例

 メモです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# filter(id__in=[1266, 1267]) は all() に置き換えても同様
 
# モデルオブジェクト取得の基本形
Product.objects.filter(id__in=[1266, 1267])
    #結果: <QuerySet [<Product: PRD-0001A>, <Product: PRD-0002/0002M>]>
 
 
# values() の使い方例
Product.objects.filter(id__in=[1266, 1267]).values('id', 'name')
    #結果: <QuerySet [{'id': 1266, 'name': 'PRD-0001A'}, {'id': 1267, 'name': 'PRD-0002/0002M'}]>
    #ValuesQuerySetと呼ばれるデータ型
 
# get()で一つのレコードだけ扱う場合
Product.objects.filter(id__in=[1266, 1267]).get(id=1266)
    #結果: <Product: PRD-0001A>
 
Product.objects.filter(id__in=[1266, 1267]).values('id', 'name').get(id=1266)
    #結果: {'id': 1266, 'name': 'PRD-0001A'}
 
 
# values_list() の使い方 *タプルを返す
Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name')
    #結果: <QuerySet [(1266, 'PRD-0001A'), (1267, 'PRD-0002/0002M')]>
 
Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name').get(id=1266)
    #結果: (1266, 'PRD-0001A')
 
list(Product.objects.filter(id__in=[1266, 1267]).values_list('id', 'name'))
    #結果: [(1266, 'PRD-0001A'), (1267, 'PRD-0002/0002M')]
 
 
# get()で一つのレコードだけ扱う場合
Product.objects.filter(id__in=[1266, 1267]).values_list('name').get(id=1266)
    #結果: ('PRD-0001A',)
 
Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True).get(id=1266)
    #結果: 'PRD-0001A'
 
# flat=True の例 *フィールドは一つだけ指定します。複数の場合エラーになります。
Product.objects.filter(id__in=[1266, 1267]).values_list('name') #flat=True なし
    #結果: <QuerySet [('PRD-0001A',), ('PRD-0002/0002M',)]>
 
Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True) #flat=Ture あり
    #結果: <QuerySet ['PRD-0001A', 'PRD-0002/0002M']>
 
list(Product.objects.filter(id__in=[1266, 1267]).values_list('name')) #flat=True なし
    #結果: [('PRD-0001A',), ('PRD-0002/0002M',)]
 
list(Product.objects.filter(id__in=[1266, 1267]).values_list('name', flat=True)) #flat=Ture あり
    #結果: ['PRD-0001A', 'PRD-0002/0002M']
 
 
# 外部キーも参照できる
Product.objects.filter(id__in=[1266, 1267]).values('id', 'name', 'category1__name')
    #結果: <QuerySet [{'id': 1266, 'name': 'PRD-0001A', 'category1__name': 'Wheel and axle'}, {'id': 1267, 'name': 'PRD-0002/0002M', 'category1__name': 'Pulley'}]>

0 件のコメント:

コメントを投稿