1. TOP
  2. ブログ
  3. Django データベース SQL SELECTによるデータ取得方法 一覧によるまとめ

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}]>

外部キーのデータ取得

OneToOneField、 ForeignKey、またはManyToManyField 属性のデータは下記のように結合してデータを取得

>>> Blog.objects.values('name', 'entry__headline')
<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() )


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)) )

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


B!

前の記事:Django データベース モデルのフィールド 一覧表によるまとめ

次の記事:Djangoレスポンスコード301,302,404,410返す方法まとめ[responsecode]