Django フィールドルックアップの使い方

Django フィールドルックアップの使い方

Django Querysetのfilter(), exclude(), get()メソットでは、フィールドルックアップを使って条件の指定などができます。

使用方法

filter(), exclude(), get()メソット内で、「カラム名__ルックアップフィールド名」の形式で使用することができます。

Entry.objects.get(id__exact=14)

これを使って様々な条件でモデルの絞り込みを行うことができます。

また、複数のルックアップフィールドを組み合わせて使用することもできます。

Entry.objects.filter(pub_date__week_day__gte=2)

フィールドルックアップ一覧

ルックアップフィールド
説明使用例
isnullNULLかどうか
Entry.objects.filter(pub_date__isnull=True)

Entry.objects.filter(pub_date__isnull=False)
in
INEntry.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<=
rangeBETWEEN … 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) )
containsLIKE ‘%~%’
icontainsILIKE ‘%~%’
(大文字小文字区別なし)
containsLIKE ‘%~%’
icontainsILIKE ‘%~%’
(大文字小文字区別なし)
startswithLIKE ‘~%’
istartswithILIKE ‘~%’
(大文字小文字区別なし)
endswith
LIKE ‘%~’
iendswithILIKE ‘%~’
(大文字小文字区別なし)
dateDateField
year
month
day
week
week_day曜日
quarter四半期
timeTileField
hour
minute
second

暗黙のタイムゾーン変換

Djangoにタイムゾーンの設定がされている場合(USE_TZがTrueになっている場合)、year以外の時間系のルックアップフィールドでは暗黙のタイムゾーン変換が行われます。

このときCONVERT_TZ()が使用されるので、MySQLのサーバー設定をきちんと行っていないとすべてNULLになって死にます。

期待通りの動作をしない場合は、以下のコマンドでMySQLのサーバーのタイムゾーン設定を行いましょう。

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql

参考リンク

QuerySet API reference | Django documentation | Django