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正規表現
isnullnull判定
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"が含まれる要素を取得できます。