絞り込み(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()