Django
で Queryset
の filter
メソッドを使用している時に同じモデルの異なるフィールド同士を検索条件に設定する方法を説明します。
前提条件
今回動作確認した環境は下記の通りです。
- Python : 3.6.1
- Django : 3.0.5
同一モデルのフィールド同士を検索条件に設定する
普通に「 field_a=field_b
」みたいに設定してもエラーになるので、下記のように実装します。
from django.db.models import F
from sample.model import Sample
sample = Sample.objects.filter(field_a=F('field_b'))
djanog.db.models
の F
関数を使用することでフィールド同士を検索条件に設定可能です。
イコールの条件だけでなく、「 gte
」や「 lte
」などの比較条件も使用できます。
sample = Sample.objects.filter(field_a__gte=F('field_b'))
sample = Sample.objects.filter(field_a__lte=F('field_b'))
最後に
同一モデルのフィールド同士を検索条件として設定することはきちんとモデルの設計などできてたらあまりないんですが、既存のシステムのリプレースなどでは既存のコードで普通にフィールド同士の比較が検索条件に入っていたりするので、きちんと設定方法を理解しておきたいですね。
コメント