![見出し画像](https://assets.st-note.com/production/uploads/images/89209867/rectangle_large_type_2_a79190754f50097ad8defd42b7c7b563.png?width=1200)
Django_modelの特定のフィールドの特定の値を抽出する #291日目
【一言日記】
昨日は手足口病を発症した長男(3歳)が、痒さと痛さで超絶不機嫌でかなり辛い一日でした。。今日は夜まで仕事と勉強だったので、私は少し回復してきました。嫁、すまん。おつかれ。
Djangoのモデルのあれこれです。以前にも別のTipsをまとめました。
今回はモデル一式ではなく、特定の値だけ抽出する方法についてです。
例えば以下のようなモデルがあったとします。
class Project(models.Model):
enterprise = models.ForeignKey('Enterprise', on_delete=models.CASCADE, related_name='projects')
name = models.CharField(max_length=255, blank=False)
leader = models.ForeignKey("Leader", related_name="projects")
このモデルから、インデックス番号1であるnameの値を抽出する方法はいくつかあります。
get()で取得した後にカラム名を指定します。
p = Project.objects.get(pk=1)
p.name
print(p.name)
# pk=1のnameがYMだとしたら↓
YM
values_list()の引数にフィールド値を渡せばタプルリストが返ってきます。オプションをflat=Trueとすると、タプルではなく1つの値として返ってきます。
p_name = Project.objects.values_list('name', flat=True).get(pk=1)
print(p_name)
# pk=1のnameがYMだとしたら↓
YM
flat=Falseだとタプルになります。
p_name = Project.objects.values_list('name', flat=False).get(pk=1)
print(p_name)
# pk=1のnameがYMだとしたら↓
('YM',)
values_list()はフィールド値を複数指定できます。この場合はflat=Falseにしておきます。
p_name = Project.objects.values_list('name', 'enterprise', flat=false).get(pk=1)
print(p_name)
# pk=1のnameがYMでenterpriseがXXXXだとしたら↓
('YM', 'XXXX')
values()だと辞書で返ってきます。
p_name = Project.objects.values('name').get(pk=1)
print(p_name)
# pk=1のnameがYMだとしたら↓
{'name': 'YM'}
values()も複数指定できます。
p_name = Project.objects.values('name', 'enterprise').get(pk=1)
print(p_name)
# pk=1のnameがYMでenterpriseがXXXXだとしたら↓
{'name': 'YM', 'enterprise': 'XXXX'}
filterの複数指定についても触れておきます。
インデックス番号1だけでなく、2も3も取得したい時などは、「__in」で一括取得できます。アンダーバー2つです。
pk_list = [1, 2, 3]
p_names = Project.objects.filter(pk__in=pk_list)
# 上記でインデックス番号1,2,3のQuerySetを取得できる。
ここまでお読みいただきありがとうございました!!
参考
この記事が気に入ったらサポートをしてみませんか?