Django データベース SQL SELECTによるデータ取得方法 一覧によるまとめ
更新日:2021年2月1日Djangoで、データベースからSQLのSELECTに相当する操作でデータを取得する時の記述方法について、一覧にまとめたので記載します。
モデルは、下記公式ドキュメント記載の Blog,Author,Entry モデルを例として記載しています。
クエリを作成する
SELECT句
全件取得(全列)
q = Entry.objects.all()
全件取得(指定列)
q = Blog.objects.values('id', 'name')
指定件数取得[:終了INDEX]
最初の5件取得
q = Entry.objects.all()[:5]
指定数取得[開始INDEX:終了INDEX:STEP]
1,3,5,7,9番目のデータ取得
q = Entry.objects.all()[0:10:2]
1件取得
e = Entry.objects.order_by('headline')[0:1].get()
SELECT COUNT(*)
件数取得:count()
c = Entry.objects.filter(headline__contains = 'Lennon').count()
グループ化して集計数取得
entryとauthorsモデルを結合してグループ化annotate()を追加して、集計数Count('entry')を取得の例
>>> Blog.objects.values('entry__authors').annotate(entries=Count('entry'))
<QuerySet [{'entry__authors': 1, 'entries': 33}]>
<QuerySet [{'entry__authors': 1, 'entries': 33}]>
外部キーのデータ取得
OneToOneField、 ForeignKey、またはManyToManyField 属性のデータは下記のように結合してデータを取得
>>> Blog.objects.values('name', 'entry__headline')
<QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'},
{'name': 'My blog', 'entry__headline': 'Another entry'}, ...]>
<QuerySet [{'name': 'My blog', 'entry__headline': 'An entry'},
{'name': 'My blog', 'entry__headline': 'Another entry'}, ...]>
ORDER BY句
order_by()使用。降順(DESC)は -追加またはreverse()
Entry.objects.order_by('-pub_date', 'headline')
上記は、pub_date 降順(DESC), headline 昇順(ASC)の例
WHERE条件
通常はfilter()、ANDは引数追加、NOTはexclude
Entry.objects.filter(
headline__startswith='What'
,pub_date__gte=datetime.date(2005, 1, 30)
).exclude(
pub_date__gte=datetime.date.today() )
headline__startswith='What'
,pub_date__gte=datetime.date(2005, 1, 30)
).exclude(
pub_date__gte=datetime.date.today() )
OR条件の場合はQオブジェクトを使用
NOTは~Q、ANDは引数追加または&、ORは |
from django.db.models import Q
q = Entry.objects.filter(
~Q(authors__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) )
q = Entry.objects.filter(
~Q(authors__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) )
WHERE句のフィールドルックアップ
WHERE句内演算子のフィールドルックアップについて、下記表にまとめたので記載します。
記述方法:field__lookuptype=value
WHERE句内演算子一覧
参考SQL | フィールドルックアップ | 使用例 |
---|---|---|
= | =またはexact |
get(id=14) get(id__exact=14) |
ILIKE '~' |
iexact (大文字小文字区別なし) |
filter(name__iexact='beatles blog') |
IS NULL | exact=None | filter(id__exact=None) |
IS NULL | isnull=True | filter(pub_date__isnull=True) |
IS NOT NULL | isnull=False | filter(pub_date__isnull=False) |
IN | in | filter(id__in=[1, 3, 4]) |
> | gt | filter(id__gt=4) |
>= | gte | filter(id__gte=4) |
< | lt | filter(id__lt=4) |
<= | lte | filter(id__lte=4) |
BETWEEN … AND … | range |
import datetime start_date = datetime.date(2005, 1, 1) end_date = datetime.date(2005, 3, 31) Entry.objects.filter( pub_date__range = (start_date, end_date) ) |
LIKE '%~%' | contains | get( headline__contains='Lennon' ) |
ILIKE '%~%' |
icontains (大文字小文字区別なし) |
get( headline__icontains='Lennon' ) |
LIKE '~%' | startswith | filter( headline__startswith='Lennon' ) |
ILIKE '~%' |
istartswith (大文字小文字区別なし) |
filter( headline__istartswith='Lennon' ) |
LIKE '%~' | endswith | filter( headline__endswith='Lennon' ) |
ILIKE '%~' |
iendswith (大文字小文字区別なし) |
filter( headline__iendswith='Lennon' ) |
(DateFieldの場合) |
date 日付 |
filter( pub_date__date = datetime.date(2005, 1, 1) ) filter( pub_date__date__gt = datetime.date(2005, 1, 1) ) |
(DateFieldの場合) |
year 何年 |
filter( pub_date__year=2005 ) filter( pub_date__year__gte=2005 ) |
(DateFieldの場合) |
month 何月 |
filter( pub_date__month=12 ) filter( pub_date__month__gte=6 ) |
(DateFieldの場合) |
day 何日 |
filter( pub_date__day=3 ) filter( pub_date__day__gte=3 ) |
(DateFieldの場合) |
week 何週 |
filter( pub_date__week=52 ) |
(DateFieldの場合) |
week_day 何曜日 |
filter( pub_date__week_day=2 ) filter( pub_date__week_day__gte=2 ) |
(DateFieldの場合) |
quarter 四半期 |
filter( pub_date__quarter=2 ) |
(DateTimeFieldの場合) |
time 何時何分 |
14:30の場合 filter( pub_date__time = datetime.time(14, 30) ) 8:00~17:00の場合 filter( pub_date__time__range = (datetime.time(8), datetime.time(17)) ) |
(DateTimeFieldの場合) |
hour 時 |
filter( time__hour=5 ) filter( time__hour__gte=12 ) |
(DateTimeFieldの場合) |
minute 分 |
filter( time__minute=46 ) filter( timestamp__minute__gte=29 ) |
(DateTimeFieldの場合) |
second 秒 |
filter( time__second=2 ) filter( timestamp__second__gte=31 ) |
詳細については下記のDjango公式ドキュメントをご参照下さい。
QuerySet API reference