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"が含まれる要素を取得できます。
