Djangoのデータベース操作まとめ
クエリメソッド(QueryAPI)一覧表
Django v2.0に対応
各メソッドの詳細は公式サイトを参照のこと https://docs.djangoproject.com/ja/2.0/ref/models/querysets/
大分類 | 小分類 | メソッド |
---|---|---|
全件取得 | all() | |
検索条件を指定 | 肯定 | filter(**kwargs) |
NOT条件 | exclude(**kwargs) | |
IN条件の中身をリストで指定する | in_bulk(id_list=None, field_name=‘pk’) | |
並び順を指定 | 昇順 | order_by(*fields) |
降順 | reverse() | |
クエリセットから インスタンスを取得 | 検索に一致したもの | get(**kwargs) |
指定した日付順で 最新のもの | latest(*fields) | |
指定した日付順で 最古のもの | earliest(*fields) | |
クエリセットの先頭 | first() | |
クエリセットの最後 | last() | |
レコードを新規登録する | 新規登録 | create(**kwargs) |
条件に一致するものを取得 無い場合は新規登録して取得 | get_or_create(defaults=None, **kwargs) | |
条件に一致するものを更新 無い場合は新規登録 | update_or_create(defaults=None, **kwargs) | |
一括登録する | bulk_create(objs, batch_size=None) | |
一括更新する | update(**kwargs) | |
一括削除する | delete() | |
特定のフィールドを集計 | テーブル内の集計 | aggregate(*args, **kwargs) |
参照先テーブルの集計 | annotate(*args, **kwargs) | |
該当のレコード件数 | count() | |
抽出したレコードから 重複の無い日付配列を作る | dates(field, kind, order=‘ASC’) | |
抽出したレコードから 重複の無い時刻配列を作る | datetimes(field_name, kind, order=‘ASC’, tzinfo=None) | |
クエリセットの存在をチェック | exists() | |
インスタンスの一部だけを取得 | 結果を辞書のリストで取得 | values(*fields, **expressions) |
結果をタプルのリストで取得 | values_list(*fields, flat=False, named=False) | |
特定のフィールドの 重複無しリストを作る | distinct(*fields) | |
SQLを直接実行する | SQLを直に設定する(一部) | extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None) |
SQLを直に設定する(全部) | raw(raw_query, params=None, translations=None) | |
クエリセット同士の集合演算 | 和集合 | union(*other_qs, all=False) |
積集合 | intersection(*other_qs) | |
差集合 | difference(*other_qs) | |
パフォーマンスチューニング キャッシング | SQLのJOIN句を使って 関係先を同時に取得しキャッシュ 1-1,N-1で有効 | select_related(*fields) |
関係先を先行取得してキャッシュ 1-N、N-Nで有効 | prefetch_related(*lookups) | |
パフォーマンスチューニング 重いカラムを取得しない | 指定カラムだけ取得しない | defer(*fields) |
指定カラムだけ取得する | only(*fields) | |
パフォーマンスチューニング 巨大なテーブルをループで扱う | iterator(chunk_size=2000) | |
データベースのレコードロック | select_for_update(nowait=False, skip_locked=False, of=()) | |
デフォルト以外のデータベース | using(alias) | |
空のクエリセットを作る | none() |
データベースの検索
filter, exclude, getでは検索条件を指定する。
指定方法は用意された記述法を使う。詳しくは公式サイトの以下のページを参照
参考:公式サイト
https://docs.djangoproject.com/ja/2.0/topics/db/search/
https://docs.djangoproject.com/ja/2.0/ref/models/expressions/
キーワード | 効果 |
---|---|
exact, iexact | 完全一致 ※演算子未指定時のデフォルト |
contains, icontains | 部分一致 |
in | いずれかを完全一致(配列を指定) |
gt | より大きい |
gte | 以上 |
lt | 未満 |
lte | 以下 |
startswith, istartswith | ~で始まる |
endswith, iendswith | ~で終わる |
range | 範囲指定 |
regex, iregex | 正規表現 |
isnull | null判定 |
date,year…second | 時間の要素で判定 |
filterメソッド
SQLでいうところのWHERE句の部分の条件式のことになります。
DjangoではSQL文を直接記述するのではなく、ラッパーであるfilterメソッドなどを利用してSQL文と同等の処理を記述していきます。
完全一致検索
Model.objects.filter(field="条件")
or
Model.objects.filter(field__exact="条件")
LIKE句検索
それぞれのフィールドの条件の前にi
をつけることで大文字小文字の区別をなくすことができます。
完全一致
大文字小文字区別あり
Model.objects.filter(field__exact="ABC")
この場合はフィールドの値が文字列"ABC"
の要素を取得できます。
大文字小文字区別なし
Model.objects.filter(field__iexact="ABC")
この場合は大文字小文字の区別なくフィールドの値が文字列"abc"
の要素を取得できます。
部分一致
Model.objects.filter(field__contains="ABC")
この場合はフィールドの値の中に文字列"ABC"
が含まれる要素が取得できます。
前方一致
Model.objects.filter(field__startswith="ABC")
この場合はフィールドの値が文字列"ABC"
で始まる要素が取得できます。
後方一致
Model.objects.filter(field__endswith="ABC")
この場合はフィールドの値が文字列"ABC"
で終わる要素が取得できます。
大小比較
より大きい(greater than)
Model.objects.filter(field__gt=4)
この場合だと指定したフィールドが4より大きい要素が取得できます。つまり4は含まれない。
以上(greater than equal)
Model.objects.filter(field__gte=4)
この場合だと指定したフィールドが4以上の要素が取得できます。つまり4が含まれる。
より小さい(less than)
Model.objects.filter(field__lt=4)
この場合だと指定したフィールドが4より小さい要素が取得できます。つまり4は含まれない。
以下(less than equal)
Model.objects.filter(field__lte=4)
この場合だと指定したフィールドが4以下の要素が取得できます。つまり4が含まれる。
IN句検索
Model.objects.filter(field__in=["ABC","DEF","GHI"])
この場合だと指定したフィールドの要素が文字列"ABC"
,"DEF"
,"GHI"
のいずれかに当てはまる要素が取得できます。
BETWEEN句検索
Model.objects.filter(field__range=(3,9))
この場合だと指定したフィールドの値が3
から9
の範囲の要素が取得できます。
日付の厳密一致
DateField又は、DateTimeFieldに指定できます。
- 年 -
Model.objects.filter(field__year=2018)
フィールドの値が2018年を示す要素を取得できます。
- 月 -
Model.objects.filter(field__month=10)
フィールドの値が10月を示す要素を取得できます。
- 日 -
Model.objects.filter(field__day=1)
フィールドの値が1日を示す要素を取得できます。
- 応用 - filterメソッドには複数の条件を指定することもできるので
Model.objects.filter(field__year=2018,field__month=10)
のようにすると2018年10月の要素を取得することができます。
IS NULL
Model.objects.filter(field__isnull=True)
フィールドの値がnull
の要素を取得できます。
IS NOT NULL
Model.objects.filter(field__isnull=False)
フィールドの値がnull
ではない要素を取得できます。
全文検索
Model.objects.filter(field__search="ABC")
フィールドの値に文字列"ABC"
が含まれる要素を取得できます。