QuerySet์ด๋?
1. QuerySet ์ ์
- QuerySet์ Django ORM(Object-Relational Mapping)์ ํต์ฌ ์์๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง๋
๊ฐ์ฒด์ ๋ฆฌ์คํธ๋ฅผ ํํํ๋ค. - ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฒ์ํ ๋ ๊ฒ์ผ๋ฅด๊ฒ ํ๊ฐ(Lazy Evaluation) ๋๋ค.
์ฆ, ์ฟผ๋ฆฌ๊ฐ ์ค์ ๋ก ์คํ๋๊ธฐ ์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ์ง ์๋๋ค.
2. QuerySet ์์ฑ ๋ฐฉ๋ฒ
1) ๊ธฐ๋ณธ QuerySet ์์ฑ
from myapp.models import Book
# ์ ์ฒด ๊ฐ์ฒด ์กฐํ
books = Book.objects.all()
2) ํํฐ๋ง์ ํตํ QuerySet
# ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
books_by_author = Book.objects.filter(author="John Doe")
3) QuerySet ๋ฉ์๋ ์ฒด์ด๋
# ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํ์ฌ ๋ฐ์ดํฐ ๊ฒ์
books = Book.objects.filter(author="John Doe").exclude(price__lt=10).order_by('-published_date')
3. QuerySet ์ฃผ์ ๋ฉ์๋
1) ์กฐํ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`all()` | ๋ชจ๋ธ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํจ |
`filter(**kwargs)` | ์ง์ ๋ ์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๊ฐ์ฒด๋ง ๋ฐํํจ |
`exclude(**kwargs)` | ์ง์ ๋ ์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์๋ ๊ฐ์ฒด๋ง ๋ฐํํจ |
`get(**kwargs)` | ์กฐ๊ฑด๊ณผ ์ ํํ ์ผ์นํ๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐํํจ (๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์) |
์์ :
books = Book.objects.filter(author="Alice") # Alice๊ฐ ์ ์์ธ ์ฑ
book = Book.objects.get(id=1) # ID๊ฐ 1์ธ ์ฑ
2) ํ๋ ์กฐํ ์ต์
Django ORM์ ๋ค์ํ ์กฐํ ์ต์ ์ ์ ๊ณตํ๋ฉฐ, ํ๋ ์ด๋ฆ ๋ค์ ์กฐ๊ฑด ์ฐ์ฐ์๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
์ฐ์ฐ์ | ์ค๋ช |
`exact` | ์ ํํ ์ผ์นํ๋ ๊ฐ (๊ธฐ๋ณธ๊ฐ) |
`iexact` | ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ์ ํํ ์ผ์น |
`contains` | ์ง์ ๋ ๊ฐ์ ํฌํจํ๋์ง ๊ฒ์ฌ |
`icontains` | ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ํฌํจ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ |
`startswith` | ์ง์ ๋ ๊ฐ์ผ๋ก ์์ํ๋์ง ๊ฒ์ฌ |
`istartswith` | ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ์์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ |
`endswith` | ์ง์ ๋ ๊ฐ์ผ๋ก ๋๋๋์ง ๊ฒ์ฌ |
`iendswith` | ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ๋๋๋์ง ๊ฒ์ฌ |
`in` | ์ฃผ์ด์ง ๊ฐ ๋ชฉ๋ก ์ค ํ๋์ ํด๋นํ๋์ง ๊ฒ์ฌ |
`gt`, `gte` | ํฌ๋ค (greater than), ํฌ๊ฑฐ๋ ๊ฐ๋ค (greater than or equal) |
`lt`, `lte` | ์๋ค (less than), ์๊ฑฐ๋ ๊ฐ๋ค (less than or equal) |
`isnull` | `True`๋ฉด ๊ฐ์ด `NULL`์ธ์ง ๊ฒ์ฌ |
`range` | ๋ฒ์ ๋ด์ ํฌํจ๋๋์ง ๊ฒ์ฌ |
`year`, `month` | ๋ ์ง ํ๋์์ ํน์ ์ฐ๋, ์์ ํด๋นํ๋ ๊ฐ์ฒด๋ฅผ ํํฐ๋ง |
์์ :
# price๊ฐ 20 ์ด์์ธ ์ฑ
books = Book.objects.filter(price__gte=20)
# ์ ๋ชฉ์ 'Python'์ด ํฌํจ๋ ์ฑ
(๋์๋ฌธ์ ๊ตฌ๋ถ ์์)
books = Book.objects.filter(title__icontains="python")
# ID๊ฐ 1, 2, 3 ์ค ํ๋์ธ ์ฑ
books = Book.objects.filter(id__in=[1, 2, 3])
# ์ถํ์ผ์ด 2023๋
์ธ ์ฑ
books = Book.objects.filter(published_date__year=2023)
3) ์ ๋ ฌ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`order_by()` | ๋ฐ์ดํฐ๋ฅผ ํน์ ํ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ |
์์ :
# ์ถํ์ผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
books = Book.objects.all().order_by('published_date')
# ์ถํ์ผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
books = Book.objects.all().order_by('-published_date')
4) ๋ฐ์ดํฐ ๊ด๋ จ ๋ฉ์๋
๋ฉ์๋ | ์ค๋ช |
`create()` | ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ |
`save()` | ๊ฐ์ฒด๋ฅผ ์ ์ฅ (์์ ๋ ๋ด์ฉ์ ์ ์ฅํ ๋ ์ฌ์ฉ) |
`delete()` | ๊ฐ์ฒด๋ฅผ ์ญ์ |
์์ :
# ์ ๊ฐ์ฒด ์์ฑ
new_book = Book.objects.create(title="New Book", author="Author", price=10)
# ๊ฐ์ฒด ์์ ๋ฐ ์ ์ฅ
book = Book.objects.get(id=1)
book.price = 15
book.save()
# ๊ฐ์ฒด ์ญ์
book.delete()
4. Lazy Evaluation (๊ฒ์ผ๋ฅธ ํ๊ฐ)
- QuerySet์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ฆ์ ์คํํ์ง ์๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ค์ ๋ก ํ์ํ ๋(`list()`, ๋ฐ๋ณต๋ฌธ, `len()` ๋ฑ) ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค.
์์ :
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์คํ๋์ง ์์
books = Book.objects.filter(author="John")
# ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์คํ๋จ
for book in books:
print(book.title)
5. QuerySet์ ์ฅ์
- Pythonic ์ฝ๋: SQL ๋ฌธ์ ์์ฑํ์ง ์์๋ Python ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ: ORM์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ์ ์์กดํ์ง ์๊ณ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ์์ ์ฑ: SQL ์ธ์ ์ ๋ฐฉ์ง ๊ธฐ๋ฅ ๋ด์ฅ
6. QuerySet ์ ๋ฆฌ
Django์ QuerySet์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ๋จ์ํํ๋ฉด์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ,
๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํ ์ ์๋ค:
- ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ (`filter`, `exclude` ๋ฑ)
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ (`order_by`)
- ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ, ์์ , ์ญ์ (`create`, `save`, `delete`)
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250131] django DRF(Django Rest Framework)๋~ (0) | 2025.01.31 |
---|---|
[250122] DateTimeField() ๊ฐ๋ ์ ๋ฆฌ~ (0) | 2025.01.22 |
[250120] HttpResponse์ render์ ์ฐจ์ด์ (1) | 2025.01.20 |
[250116] ์คํค๋ง(Schema)์ ERD(Entity-Relationship Diagram) (7) | 2025.01.16 |
[250115] REST ์ RESTful ์ ๋ํ ์ ๋ฐ์ ์ธ ๊ฐ๋ ์ ๋ฆฌ~ (1) | 2025.01.15 |