LoginSignup
1
0

More than 1 year has passed since last update.

Django クエリ操作

Posted at

絞り込み(Filter)

クエリ  説明
Model.objects.filter(field='フィールド名') field='フィールド名で絞り込む'
Model.objects.filter(field1='フィールド名', field2='フィールド名') field1かつfield2で絞り込む
Model.objects.filter(field__startswith='A') filedがAから始まる行だけ絞り込む
Model.objects.filter(field__endswith='B') fieldがBで終わる行だけ絞り込む
Model.objects.filter(age__gt=20) ageが20より大きい行だけ絞り込む
Model.objects.filter(age__li=20) ageが20より小さい行だけ絞り込む
Model.objects.filter(age__gte=20) ageが20以上の行だけ絞り込む
Model.objects.filter(age__lte=20) ageが20以下の行だけ絞り込む
Model.objects.filter(field__in=['○○', XX']) fieldの値が[]内の文字列に該当するレコードのみ
Model.objects.filter(field__contains='○○') fieldに○○を含むレコードのみ(部分一致、 大文字小文字を区別)
Model.objects.filter(field__icontains='○○') fieldに○○を含むレコードのみ(部分一致、 大文字小文字を区別しない)
Model.objects.filter(field__isnull=True) fieldがNULLのレコードのみ
Model.objects.exclude(field=○○) fieldが○○以外のものを取り出す
Model.objects.values('column1', 'column2').all() column1とcolumn2だけ取り出す

OR条件で絞り込む場合
from django.db.models import Q
Model.objects.filter(Q(field1='フィールド名')|Q(field2='フィールド名'))

集計する

クエリ 説明
Model.objects.aggregate(Max('column')) 最大値を求める
Model.objects.aggregate(Min('column')) 最小値を求める
Model.objects.aggregate(Avg('column')) 平均値を求める
Model.objects.aggregate(Sum('column')) 合計値を求める

group byでカラムに応じて集計(annotate)

Model.objects.values('column1').annotate(Max('column2'))
coumn1でGroup Byして、column2のMaxを計算する。

外部テーブルの絞り込み

クエリ 説明
Model.objects.filter(外部テーブル__カラム='○○') 外部テーブルのカラムを指定して絞り込み
Model.objects.filter(外部テーブル__外部テーブル__カラム='○○') 外部テーブルの外部テーブルのカラムを指定して絞り込み
Model.objects.order_by('外部テーブル__カラム') 外部テーブルのカラムで並び替え(昇順)
Model.objects.order_by('-外部テーブル__カラム') 外部テーブルのカラムで並び替え(降順)
Model.objects.values('外部テーブル__カラム').annotate(Count('id')) 外部テーブルのカラムでGroup Byして集計

逆参照も可能

models.py
class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

class Team(models.Model):
    name = models.CharField()
    member = models.ForeignKey(Person)
Team.objects.filter(person__name='太郎').all()
Person.objects.filter(team__name='チーム1').all()
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0