見出し画像

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を取得できる。


ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?