๐ ์ด ํฌ์คํ ์์๋ Django ORM์ผ๋ก OR, AND, NOT ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์์ต๋๋ค.
๐ฅ OR ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ
๐ฅ AND ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ
๐ฅ NOT ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ
โ๏ธ DB์์ ์ฅ์ฌ์, ๊น์ฌ์, ๋ฐ์ฌ๋ฆฌ๋, ์ฅ์์ผ, ๊ฐ์ฌ์ค, ์์ฌ์ธ ๋ฑ์ด ์์ต๋๋ค. ์ฑ์ด ์ฅ์ผ๋ก ์์ํ๊ฑฐ๋ ์ด๋ฆ์ด ์ฌ๋ก ์์ํ๋ ์ฌ๋์ ๊ตฌํ๋ ค๊ณ ํ๋ค.
โ๏ธ ์ ์กฐ๊ฑด์ SQL ์ง์๋ฌธ์ผ๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
mysql>>> SELECT * FROM accounts WHERE first_name LIKE '์ฌ%' OR last_name LIKE '์ฅ%';
โ๏ธ Django ORM ๋ฌธ๋ฒ์ผ๋ก OR์ฐ์ฐ์ ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก query๋ฅผ ์์ฑํ ์ ์๋ค.
- ๐ ๋ฐฉ๋ฒ1:
queryset_1 | queryset_2
- ๐ ๋ฐฉ๋ฒ2:
filter( Q( ์กฐ๊ฑด ) | Q( ์กฐ๊ฑด) )
โ๏ธ ๋ฐฉ๋ฒ1์ ์ฌ์ฉํด์ ORM์ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
qs1 = User.objects.filter(first_name__startswith='์ฌ') | User.objects.filter(last_name__startswith='์ฅ')
โ๏ธ ๋ฐฉ๋ฒ2์ ์ฌ์ฉํด์ ORM์ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค. ๋ ๊ฐ๊ฒฐํด์ง๊ฑธ ๋ณผ ์ ์๋ค.
from django.db.models import Q qs2 = User.objects.filter(Q(first_name__startswith='์ฌ')|Q(last_name__startswith='์ฅ'))
โ๏ธ query ๋งค์๋๋ฅผ ์ด์ฉํ๋ฉด ์ค์ SQL๋ฌธ์ ํ์ธํ ์ ์๋ค.
str(qs1.query) == str(qs2.query) # True
โ๏ธ AND ์ฐ์ฐ์ผ๋ก ์ฌ๋ฌ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ row์ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
โ๏ธ DB์์ ์ฅ์ฌ์, ์ฅ์ฌ์, ์ฅ์ฌ๋ฆฌ๋, ์ฅ์ฌ์ผ, ์ฅ์ฌ์ค, ์ฅ์ฌ์ธ ๋ฑ์ด ์์ต๋๋ค. ์ฑ์ด ์ฅ์ผ๋ก ์์ํ๊ณ ์ด๋ฆ์ด ์ฌ๋ก ์์ํ๋ ์ฌ๋์ ๊ตฌํ๋ ค๊ณ ํ๋ค.
SELECT * FROM accounts WHERE first_name LIKE '์ฌ%' AND last_name LIKE '์ฅ%';
โ๏ธ Django ORM ๋ฌธ๋ฒ์ผ๋ก AND์ฐ์ฐ์ ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก query๋ฅผ ์์ฑํ ์ ์๋ค.
- ๐ ๋ฐฉ๋ฒ1:
queryset_1 & queryset_2
- ๐ ๋ฐฉ๋ฒ2:
filter(<condition_1>, <condition_2>)
- ๐ ๋ฐฉ๋ฒ3:
filter(Q(<condition_1>) & Q(<condition_2>))
โ๏ธ & ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ฟผ๋ฆฌ์ ์ ๋ช ์์ ์ผ๋ก ๊ฒฐํฉํ๋ฉด ์๋์ ๊ฐ๋ค.
qs1 = User.objects.filter(first_name__startswith='์ฌ') & User.objects.filter(last_name__startswith='์ฅ')
โ๏ธ filter ๋งค์๋์์ ์ฌ๋ฌ ์กฐ๊ฑด์ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ and ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค.
qs2 = User.objects.filter(first_name__startswith='์ฌ', last_name__startswith='์ฅ')
โ๏ธ ๋ณต์กํ ์ง์๋ฅผ ์ํํ ์ ์๋๋ก ๋์์ฃผ๋ Q ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ฌ ์กฐ๊ฑด์ ๋ช ์ํ ์๋ ์๋ค.
from django.db.models import Q qs3 = User.objects.filter(Q(first_name__startswith='์ฌ') &Q(last_name__startswith='์ฅ'))
โ๏ธ ์ด๋ฅผ ์ํํ๋ ค๋ฉด ์กฐ๊ฑด์ ๋ถ์ ํ๋ NOT ์ฐ์ฐ์ด ํ์ํ๋ค.
SELECT * FROM accounts WHERE NOT id < 5;
โ๏ธ NOT์ฐ์ฐ์ Django ORM ๋ฌธ๋ฒ์ผ๋ก๋ ์ฌ์ฉํ๋ ค๋ฉด ์๋ 2๊ฐ์ง query๋ก ์์ฑํ ์ ์๋ค.
- ๐ ๋ฐฉ๋ฒ1:
exclude(<condition>)
- ๐ ๋ฐฉ๋ฒ2:
filter(~Q(<condition>))
<condition>
) ๋ฐฉ๋ฒโ๏ธ exclude๋ ~์ ์ ์ธํ๊ณ ์ ์๋ฏธ๋ก, NOT ์ฐ์ฐ์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
qs1 = User.objects.exclude(id__lt=5)
<condition>)
) ๋ฐฉ๋ฒโ๏ธ Q ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋๋ ~ ํ์๋ฅผ ํตํด NOT์ ๋ช ์ํ ์ ์๋ค.
from django.db.models import Q qs2 = User.objects.filter(~Q(id__lt=5))