1. TOP
  2. ブログ
  3. Django SQL データベース 操作 まとめ 入門(4)Where条件、演算子、LIKE

Django SQL データベース 操作 まとめ 入門(4)Where条件、演算子、LIKE

更新日:2021年2月1日
Djangoで、モデルで定義したデータベースのテーブルからデータを取得したり操作したりする方法をDjangoの公式ドキュメントを参考にして、記載しています。Where条件のField lookupsについてまとめています。

環境:Python3.8.2 Django3.1.5

=,exact,IS NULL

フィールドの値が等しい条件の記載方法です。

QuerySetのメソッドfilter(),exclude(),get()で使用できます。

Entry.objects.get(id=14)
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)

上記は下記SQLと同等です。

SELECT ... WHERE id = 14;
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;

iexact:大文字小文字は区別しない:WHERE ILIKE

iexactは大文字小文字は区別しないで等しい場合です。

Blog.objects.get(name__iexact='beatles blog')

上記は下記SQLと同等です。

SELECT ... WHERE name ILIKE 'beatles blog';
'Beatles Blog', 'beatles blog', 'BeAtLes BLoG'など値がマッチします。

isnull:True(IS NULL)、False(IS NOT NULL)

Entry.objects.filter(pub_date__isnull=True)

上記は下記SQLと同等です。

SELECT ... WHERE pub_date IS NULL;

contains:WHERE LIKE

SQLで、LIKEでキーワード検索する場合に使用できます。

Entry.objects.get(headline__contains='Lennon')

上記は下記SQLと同等です。

SELECT ... WHERE headline LIKE '%Lennon%';

'Lennon honored today' にマッチして 'lennon honored today'にはマッチしません。


icontains:WHERE ILIKE:大文字小文字は区別しない

大文字小文字は区別しないで、LIKE検索する場合です。

Entry.objects.get(headline__icontains='Lennon')

上記は下記SQLと同等です。(※SQLiteは未対応)

SELECT ... WHERE headline ILIKE '%Lennon%';

'Lennon honored today' と 'lennon honored today'の両方にマッチします。


in:WHERE IN

リストの値のいずれかに一致

Entry.objects.filter(id__in=[1, 3, 4])

上記は下記SQLと同等です。

SELECT ... WHERE id IN (1, 3, 4);

values() や values_list() を使用する場合の例です。

inner_qs = Blog.objects.filter(name__contains='Ch').values('name')
entries = Entry.objects.filter(blog__name__in=inner_qs)

下記は、フィールドが2つ以上あるためエラーとなります。

# Bad code! Will raise a TypeError.
inner_qs = Blog.objects.filter(name__contains='Ch').values('name', 'id')
entries = Entry.objects.filter(blog__name__in=inner_qs)

gt:>:より大きい

Entry.objects.filter(id__gt=4)

上記は下記SQLと同等です。

SELECT ... WHERE id > 4;

gte:>=:以上

Entry.objects.filter(id__gte=4)

上記は下記SQLと同等です。

SELECT ... WHERE id >= 4;

lt:<:より小さい

Entry.objects.filter(id__lt=4)

上記は下記SQLと同等です。

SELECT ... WHERE id < 4;

lte:<=:以下

Entry.objects.filter(id__lte=4)

上記は下記SQLと同等です。

SELECT ... WHERE id <= 4;

startswith:WHERE ... LIKE '~%':~ではじまる

Entry.objects.filter(headline__startswith='Lennon')

上記は下記SQLと同等です。(※SQLiteは未対応)

SELECT ... WHERE headline LIKE 'Lennon%';

istartswith:WHERE ... ILIKE '~%':~ではじまる(大文字小文字は区別しない)

Entry.objects.filter(headline__istartswith='Lennon')

上記は下記SQLと同等です。(※SQLiteは未対応)

SELECT ... WHERE headline ILIKE 'Lennon%';

endswith:WHERE ... LIKE '%~':~でおわる

Entry.objects.filter(headline__endswith='Lennon')

上記は下記SQLと同等です。(※SQLiteは未対応)

SELECT ... WHERE headline LIKE '%Lennon';

iendswith:WHERE ... ILIKE '%~':~でおわる(大文字小文字は区別しない)

Entry.objects.filter(headline__iendswith='Lennon')

上記は下記SQLと同等です。(※SQLiteは未対応)

SELECT ... WHERE headline ILIKE '%Lennon';

range:WHERE ... BETWEEN ... AND ...

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

上記は下記SQLと同等です。

SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

※注意
上記は pub_date が DateFieldの場合の例ですが、もし pub_date がDateTimeFieldの場合、下記のようにAM0時までとなり最終日が含まれなくなるので、DateFieldかDateTimeFieldかで注意して使用して下さい。

SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';


B!

前の記事:Django SQL データベース 操作 まとめ 入門(3)order_by、values

次の記事:Django SQL データベース 操作 まとめ 入門(5)Where条件、日付、時間