Django SQL データベース 操作 まとめ 入門(2)where条件 filter(),exclude(),Qオブジェクト
更新日:2021年2月1日環境:Python3.8.2 Django3.1.5
WHERE 検索条件:filter()
models.py例
queryset = Entry.objects.filter(pub_date__year=2006)
queryset = Entry.objects.filter(pub_date__year=2006)
上記は、カラム pub_date の年が2006のデータ取得です。
WHERE NOT 検索条件:exclude()
Entry.objects.filter(
headline__startswith='What'
).exclude(
pub_date__gte=datetime.date.today()
).filter(
pub_date__gte=datetime.date(2005, 1, 30)
)
headline__startswith='What'
).exclude(
pub_date__gte=datetime.date.today()
).filter(
pub_date__gte=datetime.date(2005, 1, 30)
)
上記は、下記条件のデータ取得です。
headline like 'What%'
AND NOT pub_date >= '今日の日付'
AND pub_date >= '2005-1-3'
NOT 条件はexclude()を使用して、filter()とexclude()はチェーンによりAND条件として結合できます。
フィルターを適用した QuerySet はユニーク
q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())
上記のように q3、q2を取得しても、元のq2、q1は追加条件の影響を受けずに元の条件のままで使用できます。
OR 条件の場合は Qオブジェクトを使用して検索
from django.db.models import Q
Q(question__startswith='Who') | Q(question__startswith='What')
Q(question__startswith='Who') | Q(question__startswith='What')
上記は、次のSQLのWHERE句と同等です。
WHERE question LIKE 'Who%' OR question LIKE 'What%'
NOT は、~を使用
Q(question__startswith='Who') | ~Q(pub_date__year=2005)
Qオブジェクトを使用して filter(),exclude(),get()でデータを取得
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
上記は、次のSQLのWHERE句と同等です。
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')