Django フィールドルックアップの使い方
Django Querysetのfilter(), exclude(), get()メソットでは、フィールドルックアップを使って条件の指定などができます。
使用方法
filter(), exclude(), get()メソット内で、「カラム名__ルックアップフィールド名」の形式で使用することができます。
Entry.objects.get(id__exact=14)
これを使って様々な条件でモデルの絞り込みを行うことができます。
また、複数のルックアップフィールドを組み合わせて使用することもできます。
Entry.objects.filter(pub_date__week_day__gte=2)
フィールドルックアップ一覧
ルックアップフィールド | 説明 | 使用例 |
isnull | NULLかどうか | Entry.objects.filter(pub_date__isnull=True) Entry.objects.filter(pub_date__isnull=False) |
in | IN | Entry.objects.filter(id__in=[1, 3, 4]) # SELECT … WHERE id IN (1, 3, 4); Entry.objects.filter(headline__in=’abc’) # SELECT … WHERE headline IN (‘a’, ‘b’, ‘c’); |
gt | > | |
gte | >= | |
lt | < | |
lte | <= | |
range | 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) ) |
contains | LIKE ‘%~%’ | |
icontains | ILIKE ‘%~%’ (大文字小文字区別なし) | |
contains | LIKE ‘%~%’ | |
icontains | ILIKE ‘%~%’ (大文字小文字区別なし) | |
startswith | LIKE ‘~%’ | |
istartswith | ILIKE ‘~%’ (大文字小文字区別なし) | |
endswith | LIKE ‘%~’ | |
iendswith | ILIKE ‘%~’ (大文字小文字区別なし) | |
date | DateField | |
year | 年 | |
month | 月 | |
day | 日 | |
week | 週 | |
week_day | 曜日 | |
quarter | 四半期 | |
time | TileField | |
hour | 時 | |
minute | 分 | |
second | 秒 |
暗黙のタイムゾーン変換
Djangoにタイムゾーンの設定がされている場合(
がTrueになっている場合)、year以外の時間系のルックアップフィールドでは暗黙のタイムゾーン変換が行われます。USE_TZ
このとき
が使用されるので、MySQLのサーバー設定をきちんと行っていないとすべてNULLになって死にます。CONVERT_TZ()
期待通りの動作をしない場合は、以下のコマンドでMySQLのサーバーのタイムゾーン設定を行いましょう。
mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql