3๋ ์ฐจ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ํญ์ ์จ์๋ orm์ด์ง๋ง, ์ฐ๋๊ฒ๋ง ์ฌ์ฉํ๋ค๋ณด๋ ์ ์ฌ์ฉํ์ง ์๋ queyset ํ์ฉ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์กฐ๊ธ ๋ฌด์งํ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ๊ณต์ document๋ฅผ ๋ณด๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋ํ๋ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ฉฐ ํ๋ฒ ๋ ๋จธ๋ฆฌ์ ์๊ธธ๋ ค๊ณ ํ๋ค.
[Queryset API]
filter(*args, **kwargs): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๋ค๋ง ๋ด์ queryset์ ๋ฐํ, ์ฌ๋ฌ ์กฐ๊ฑด์ ์ฃผ๋ฉด AND ์กฐ๊ฑด์ผ๋ก ๋ฌถ์ธ๋ค.
- lookups (method: filter(), exclude(), get())
exact: ์ ํํ ์ผ์น -> SQL: SELECT ... WHERE id = 14;
iexact: ๋์๋ฌธ์ ๊ตฌ๋ถ ์๋ ์ ํํ ์ผ์น-> SQL:SELECT ... WHERE name ILIKE 'beatles blog';
contains: ํฌํจ ์ฌ๋ถ-> SQL: SELECT ... WHERE headline LIKE '%Lemon%';
icontains: ๋์๋ฌธ์ ๋ฌด์ ํฌํจ ์ฌ๋ถ-> SQL: SELECT ... WHERE headline ILIKE '%Lemon%';
in: ๋ฆฌ์คํธ/์ฟผ๋ฆฌ์ ์ ํฌํจ ์ฌ๋ถ-> SQL: SELECT ... WHERE id in (1, 3, 4);
gt, gte, lt, lte: ~๋ณด๋ค ํฌ๋ค, ~๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค, ~๋ณด๋ค ์๋ค, ~๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค-> SQL: SELECT ... WHERE price >= 1000;
startswith: ํด๋น ๋ฌธ์์ด๋ก ์์-> SQL: SELECT ... WHERE name LIKE 'Kim%';
istartswith: ๋์๋ฌธ์ ๊ตฌ๋ฌธ ์์ด ์์-> SQL: SELECT ... WHERE LOWER(name) LIKE 'kim%'
endswith: ํด๋น ๋ฌธ์์ด๋ก ๋๋จ-> SQL: SELECT ... WHERE name LIKE '%Kim';
iendswith: ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ๋๋จ-> SQL: SELECT ... WHERE LOWER(name) LIKE '%kim'
range: ๋ฒ์ ์กฐํ-> SQL: SELECT ... WHERE date BETWEEN '2025-01-01' AND '2025-12-31'
date, month, year, day: ๋ ์ง, ์, ๋ , ์ผ-> SQL: SELECT ... WHERE DATE(timestamp) = '2025-09-30', WHERE EXTRACT(MONTH FROM order_date) = 9, WHERE EXTRACT(YEAR FROM order_date) = 2025, WHERE EXTRACT(DAY FROM order_date) = 30
week: ์ฃผ์ฐจ-> SQL: SELECT ... WHERE EXTRACT(WEEK FROM order_date) = 40
iso_year: ISO ์ฐ๋-> SQL: SELECT ... WHERE EXTRACT(ISOYEAR FROM order_date) = 2025
iso_week_day: ISO ์์ผ (1=์, 7=์ผ)-> SQL: SELECT ... WHERE EXTRACT(ISODOW FROM order_date) = 1
quarter: ๋ถ๊ธฐ (1~4)-> SQL: SELECT ... WHERE EXTRACT(QUARTER FROM order_date) = 3
time, hour, minute, second: ์๊ฐ, ์, ๋ถ, ์ด-> SQL: SELECT ... WHERE CAST(timestamp AS time) = '14:30:00', WHERE EXTRACT(HOUR FROM timestamp) = 14, WHERE EXTRACT(MINUTE FROM timestamp) = 30, WHERE EXTRACT(SECOND FROM timestamp) = 0
is_null: null ์ฌ๋ถ-> SQL: SELECT ... WHERE last_login IS NULL
regex: ์ ๊ท์ ๋งค์นญ-> SQL: SELECT ... WHERE username ~ '^[A-Z]'
iregex: ๋์๋ฌธ์ ๊ตฌ๋ถ ์๋ ์ ๊ท์ ๋งค์นญ-> SQL: SELECT ...WHERE username ~* '^[a-z]'
exclude(*args, **kwargs): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๋ค์ ์ ์ธํ queryset์ ๋ฐํํ๋ค.
annotate(*args, **kwargs): queryset์ ๊ฐ ๊ฐ์ฒด์ ๊ณ์ฐ๋ ํ๋๋ฅผ ์ถ๊ฐํ๋ค. ์ง๊ณ, ์กฐ๊ฑด, ๋จ์ ๊ฐ ๋ฑ ๋ค์ํ ๊ฐ์ ๊ฐ ๊ฐ์ฒด์ ๋ถ์ธ๋ค. ์๋ณธ ๋ชจ๋ธ์๋ ์๋ ์์ ํ๋๋ฅผ ์์ฑํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. alies๋ ์ง์ ๊ฐ๋ฅํ๋ค.
alias(*args, **kwargs): annotate()์ ์ ์ฌํ์ง๋ง ๊ฐ์ฒด์ ๊ฐ์ ์ถ๊ฐํ์ง ์๊ณ , ํํ์์ ๋์ค์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ ์ฅํ๋ค. ๊ฒฐ๊ณผ๊ฐ ์์ฒด๊ฐ ํ์ ์์ง๋ง ๋ค๋ฅธ queryset ๋ฉ์๋ ๋ฑ์์ ํ์ฉํ ๋ ์ ์ฉํ๋ค. ์ฌ์ฉํ์ง ์๋ ๊ฐ์ DB์์ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ต์ ํ ๋ฉด์์๋ ์ ์ฉํ๋ค.
from django.db.models import Count, F
# 1. alias๋ก ํํ์ ์ ์
blogs = Blog.objects.alias(entries=Count("entry"))
# 2. alias๋ฅผ filter์์ ํ์ฉ
blogs_with_many_entries = blogs.filter(entries__gt=5)
# Blog ๊ฐ์ฒด๋ง๋ค Entry ๊ฐ์๋ฅผ ๊ณ์ฐ(alias), ์ด๋ฅผ annotate๋ก ์ค์ ํ๋์ฒ๋ผ ์ฐ๊ณ , ๋ง์ง๋ง์ ๋ชจ๋ Blog์ Entry ์ดํฉ์ ๊ตฌํ๋ค.
Blog.objects.alias(entries=Count("entry")).annotate(
entries=F("entries")
).aggregate(Sum("entries"))
order_by(*fileds): queryset์ ์ ๋ ฌ์ ์ง์ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก queryset์ ๋ชจ๋ธ์ Meta.ordering์์ ์ง์ ํ ์์๋ก ์ ๋ ฌ๋๋ค. ๋ฌด์์ ์ ๋ ฌ์๋ "?"์ด ์ฌ์ฉ๋๋ฉฐ DB์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. nulls_first / nulls_last๋ก null ์ ๋ ฌ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค. ๋ํ distinct()์ ํจ๊ป ์ฌ์ฉ ์ ๊ด๊ณ ํ๋ ์ ๋ ฌ์ด ์์๊ณผ ๋ค๋ฅด๊ฒ ์๋ํ ์ ์๋ค. ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ์ ๋ ฌํ๊ธฐ ์ํด์๋ Lower()๋ฅผ ์ฌ์ฉํ๋ค. ๋ ์๋ฅผ ๋ค์ด Objects.order_by("A").order_by("B")๋ฅผ ํ๊ฒ ๋๋ฉด ๋ง์ง๋ง order_by๋ง ์ ์ฉ๋๋ค.
reverse(): queryset์ ์์๋ฅผ ๋ค๋ฐ๊พธ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.qs.reverse().reverse() ์ด๋ฐ์์ผ๋ก ํธ์ถํ๋ฉด ์๋ ์์๋ก ๋์์ค๊ฒ ๋๋ค.
distinct(*fields): qQuerySet์์ ์ค๋ณต๋ ํ(row)์ ์ ๊ฑฐํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋๋ก, SQL์ SELECT DISTINCT์ ๋์๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋จ์ํ ์ฟผ๋ฆฌ์์๋ ์ค๋ณต์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์์ง๋ง, ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ๊ฑฐ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ํํ ๊ฒฝ์ฐ ์ค๋ณต๋ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ ์ ์์ด ์ด๋ distinct()๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค. ๋ค๋ง, order_by()์ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฃผ์๊ฐ ํ์ํ๋ค. order_by()์์ ์ง์ ํ ํ๋๋ค์ด SQL์ SELECT ์ ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์, ๊ฒ๋ณด๊ธฐ์๋ ์ค๋ณต์ด ์ ๊ฑฐ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฉฐ, ์์๊ณผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ ์ ์๋ค. ๋ํ, values()์ ํจ๊ป ์ฌ์ฉํ ๋๋ ์ ๋ ฌ ๊ธฐ์ค์ด values()์ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ์ค๋ณต ์ ๊ฑฐ๊ฐ ์๋ํ ๋๋ก ๋์ํ์ง ์์ ์ ์๋ค. ๋ฐ๋ผ์ distinct()๋ฅผ ์ฌ์ฉํ ๋๋ ์ฟผ๋ฆฌ์ ์ ๋ ฌ ๊ธฐ์ค๊ณผ ์ ํ๋ ์ปฌ๋ผ์ ํจ๊ป ๊ณ ๋ คํด์ผ ํ๋ค.
values(): queryset๋ฅผ ์ํํ ๋ ๋ชจ๋ธ ์ธ์คํด์ค ๋์ ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํ๋๋ก ํ๋ ๋ฉ์๋, ๊ฐ ๋์ ๋๋ฆฌ๋ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ฉฐ key๋ ๋ชจ๋ธ์ ํ๋ ์ด๋ฆ๊ณผ ๋์๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ๋๋ฅผ ๋ฐํํ์ง๋ง values("")๋ก ์ง์ ๋ ๊ฐ๋ฅํ๋ค.ํค์๋ ์ธ์๋ก ๊ณ์ฐ์์ด๋ ํํ์๋ ํฌํจ ๊ฐ๋ฅ(values(lower_name=Lower("name"))) ํ๋ค. ๊ด๊ณ ํ๋๋ ์กฐํ ๊ฐ๋ฅํ์ง๋ง, ๋ค๋๋ค๋ ์ญ์ฐธ์กฐ๋ ๊ฒฐ๊ณผ๊ฐ ๊ณฑํด์ง ์๋ ์๋ค.
values_list(): values()์ ์ ์ฌํ์ง๋ง ๋์ ๋๋ฆฌ ๋์ ํํ์ ๋ฐํํ๋ค. ๋จ์ผ ํ๋ ์กฐํ์ flat=True๋ฅผ ์ง์ ํ๋ฉด ํํ ๋์ ๋จ์ผ ๊ฐ์ผ๋ก ๋ฐํ๋๋ฉฐ named=True๋ฅผ ์ง์ ํ๋ฉด namedTuple๋ก ๋ฐํ ๊ฐ๋ฅํ๋ค.
dates(field, kind, order='ASC'): queryset์์ ํน์ ๋ ์ง ํ๋์ ๋ชจ๋ ๋ ์ง๋ฅผ datetime.date ๊ฐ์ฒด ๋ฆฌ์คํธ๋ก ๋ฐํํ๋ค. field๋ ๋ชจ๋ธ์ DateFiled ์ด๋ฆ, kind๋ ๋ฐํํ ๋ ์ง ๋จ์ ์ง์ ("year", "month", "week", "day"), order๋ ์ ๋ ฌ ์์์ด๋ค. ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์๋ ์ง์ ํ ๋จ์๋ก ์ค๋ณต ์ ๊ฑฐ ํ ๋ฐํ๋๋ฉฐ filter์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ ์ง๋ง ์ถ์ถํ ์ ์๋ค.
datetimes(field, kind, order='ASC', tzinfo=None): queryset์์ ํน์ DatetimeField์ ๋ชจ๋ ๋ ์ง/์๊ฐ์ datetime.datetime ๊ฐ์ฒด ๋ฆฌ์คํธ๋ก ๋ณํํ๋ฉฐ, kind์๋ ๋ฐํํ ๋จ์ ("year", "month", "week", "day", "hour", "minute", "second")๊ฐ ๋ค์ด๊ฐ๋ฉฐ ์ง์ ํ ๋จ์๋ก truncated๋์ด ๋ฐํํ๋ค. tzinfo๋ ๋ฐํ ์ ์๊ฐ๋๋ฅผ ๋ณํํ tzinfo ๊ฐ์ฒด๋ก, None์ด๋ฉด ํ์ฌ Django ์๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ค. timezone.utc์ด ๋ค์ด๊ฐ๋ฉด utc ์๊ฐ๋๋ก ๋ณํ๋๋ค.
none(): ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋ ๋น queryset ์์ฑํ๋ฉฐ, isinstance(Entry.objects.none(), EmptyQuerySet) # True ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ๋๋ค.
all(): ํ์ฌ queryset์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.
union(*other_qs, all=False): sql์ UNION ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋ ๊ฐ ์ด์์ queryset ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ ๋ฉ์๋์ด๋ค. ๊ธฐ๋ณธ ๋์์ ์ค๋ณต๊ฐ์ ์ ๊ฑฐํ๊ณ ํฉ์น๋ค. ์ค๋ณต์ ํ์ฉํ๋ ค๋ฉด all=True ์ธ์๋ฅผ ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ ๊ธฐ์ค queryset์ผ๋ก ๋ชจ๋ธ์ ๋ฐํํ๋ค.
intersection(*other_qs): sql์ INTERSECT ์ฐ์ฐ๊ณผ ๋์ผํ๋ค. ์ฌ๋ฌ queryset์์ ๊ณตํต์ผ๋ก ์กด์ฌํ๋ ๊ฐ๋ง ๋ฐํํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ธฐ์ค queryset์ผ๋ก ๋ชจ๋ธ์ ๋ฐํํ๋ค.
qs1 = Author.objects.values_list("name") # [('Alice',), ('Bob',), ('Charlie',)]
qs2 = Entry.objects.values_list("headline") # [('Bob',), ('Zebra News',), ('Charlie',)]
qs3 = Extra.objects.values_list("title") # [('Charlie',), ('Alice',)]
qs_common = qs1.intersection(qs2, qs3)
print(list(qs_common)) # [('Charlie',)]
difference(*other_qs): sql์ EXCEPT ์ฐ์ฐ๊ณผ ๋์ผํ๋ค. ์ฒซ ๋ฒ์งธ queryset์๋ ์กด์ฌํ์ง๋ง, ๋ค๋ฅธ Queryset์๋ ์๋ ๊ฐ๋ค๋ง ๋ฐํํ๋ค. ์ฒซ ๋ฒ์งธ ๊ธฐ์ค queryset์ผ๋ก ๋ชจ๋ธ์ ๋ฐํํ๋ค.
extra(): django orm๋ง์ผ๋ก ํํํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ SQL ๊ตฌ๋ฌธ์ queryset์ ์ง์ ์ถ๊ฐํ ๋ ์ฌ์ฉ, ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ๋ค. ์ค๋๋ API์ด๊ธฐ ๋๋ฌธ์ ํฅํ ์์ด์ง ์์ ์ด๋ผ๊ณ ํ๋ค.
defer(*fields): ๋ชจ๋ธ์ ์ผ๋ถ ํ๋๋ฅผ ๋์ค์ ๋ถ๋ฌ์ค๋๋ก ์ง์ฐ์ํค๋ ๊ฒ์ด๋ค. ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง๊ณ ์ผ๋ถ ํ๋๋ ๋ฌด๊ฒ๊ฑฐ๋ ํ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
only(*fields): ์ฆ์ ๋ถ๋ฌ์ฌ ํ๋๋ง ์ง์ ํ๋ฉฐ, ๋๋จธ์ง๋ defer์ด ์ ์ฉ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ํ๋๋ฅผ ์ง์ฐ์ํค๊ณ ํ๋ ์ผ๋ถ๋ง ์ฆ์ ๊ฐ์ ธ์ฅ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
using(alias): ์ฌ๋ฌ DB๋ฅผ ์ฌ์ฉํ ๋ ํน์ DB๋ฅผ ์ ํํ๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด Entry.objects.using("backup") ์์ผ๋ก ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด django ํ๋ก์ ํธ์ DATABASES = {'defualt': {}, 'backup': {}} ์ด๋ ๊ฒ ๋ ๊ฐ์ DB๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค. DB ์ง์ ์์ด ์กฐํํ๋ฉด ํญ์ default DB์์ ๊ฐ์ ธ์จ๋ค. ํน์ DB๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฒซ๋ฒ์งธ ์ค ์ฒ๋ผ ์ง์ ํ๋ฉด backup DB์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ฆ, ๋์ผํ ๋ชจ๋ธ Entry๋ผ๋ DB๋ฅผ ๋ฐ๊ฟ์ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค. **** ํ์ง๋ง Entry.objects.using("backup").create(title="Test") ์ฒ๋ผ DB๋ฅผ ๋ฐ๊พธ๋ฉด ์ฐ๊ธฐ๋ ํด๋น DB์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ์ฝ๊ธฐ ์ ์ฉ ์ฟผ๋ฆฌ์์ ์ฌ์ฉ๋๋ค.
raw(raw_query, params=(), translations=None, using=None): SQL์ ์ง์ ์คํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ ์ธ์คํด์ค๋ก ๋ฐํํ๋ค.
# ORM์ผ๋ก ์๋๋ ๋ณต์กํ ์ฟผ๋ฆฌ
entries = Entry.objects.raw("SELECT * FROM entry WHERE rating > %s", [5])
for e in entries:
print(e.title)
[Queryset method]
get(*args, **kwargs): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ฌด์กฐ๊ฑด ํ๋๋ง ์กด์ฌํด์ผํ๋ฉฐ, ๊ฐ์ฒด๊ฐ ์์ ๋DoesNotExist, ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ MultipleObjectsReturned ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
create(): ๊ฐ์ฒด๋ฅผ ์์ฑํจ๊ณผ ๋์์ ์ ์ฅ๊น์ง ํ๋ฒ์ ์ํํ๋ค. pk๋ฅผ ์๋์ผ๋ก ์ง์ ํด์ ์ค๋ณต๋๋ฉด IntegrityError๊ฐ ๋ฐ์ํ๋ค.
get_or_create(): ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฉด ์์ฑํ๋ค. ๋ฐํ๊ฐ์ obj, created์์๋ created๊ฐ True๋ฉด ์๋ก ์์ฑ๋ ๊ฐ์ด๋ค. ํค์๋ ์ธ์๊ฐ ์ ์ผํด์ผ ๋์์ฑ ๋ฌธ์ ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํ๋ฉฐ ์ฌ๋ฌ ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก MultipleObjectsReturned ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
update_or_create(): ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ฉด ์ ๋ฐ์ดํธํ๊ณ , ์์ผ๋ฉด ์๋ก ์์ฑํ๋ค. defaults๋ ์ ๋ฐ์ดํธ ์ ํ๋๊ณ create_defuaults๋ ์์ฑ ์์ ํ๋์ด๋ค.
bulk_create(): ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ DB์ ์ ์ฅํ๋ค.
objs = Entry.objects.bulk_create([
Entry(headline="This is a test"),
Entry(headline="This is only a test"),
])
bulk_update(): ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธ ๊ฐ๋ฅํ๋ค.
objs[0].headline = "Updated 1"
objs[1].headline = "Updated 2"
Entry.objects.bulk_update(objs, ["headline"])
count(): DB์ ๊ฐ์ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ฏธ queryset์ด ํ๊ฐ๋ ๊ฒฝ์ฐ len()์ด ๋ ๋น ๋ฅด๋ค.
in_bulk(): pk ๋๋ ํน์ ์ ๋ํฌ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ ๋๋ฆฌ๋ก ๋ฐํ๋๋ค.
iterator(): ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ์ ์ฝ์ง ์๊ณ ์ํํ๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ์ฉํ๋ค.
latest() / earliest(): ํน์ ํ๋ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ์ต์ / ๊ฐ์ฅ ์ค๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
first() / last(): queryset์ ์ฒซ ๋ฒ์งธ / ๋ง์ง๋ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด None์ ๋ฐํํ๋ค.
aggregate(): queryset์ ์ง๊ณ๋ฅผ dict์ผ๋ก ๋ฐํํ๋ค.
exists(): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด True๋ฅผ ๋ฐํํ๋ฉฐ, if queryset: ๋ณด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถํ๊ฐ ์ ๋ค.
contains(): queryset์ ํน์ ๊ฐ์ฒด๊ฐ ํฌํจ๋ผ ์๋์ง ํ์ธํ๋ค.
update(): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ sql๋ก ์ ๋ฐ์ดํธํ๋ค. save() ๋ฐ๋ณต ํธ์ถ์ด ๋ถํ์ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ค.
Entry.objects.filter(pub_date__year=2010).update(comments_on=False)
delete(): ์กฐ๊ฑด์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ํ๋ฒ์ ์ญ์ ํ๋ค.
as_manager(): queryset ๋ฉ์๋๋ฅผ ๊ฐ์ง ์ปค์คํ Manager๋ฅผ ์์ฑํ๋ค.
MyQuerySet.as_manager()
# ์ฌ์ฉ์์
from django.db import models
# 1. ์ปค์คํ
QuerySet ์ ์
class EntryQuerySet(models.QuerySet):
def published(self):
return self.filter(is_published=True)
def recent(self):
return self.order_by('-created_at')
# 2. QuerySet ๋ฉ์๋๋ฅผ Manager๋ก ๋ณํ
class Entry(models.Model):
title = models.CharField(max_length=200)
is_published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
objects = EntryQuerySet.as_manager()
explain(): ์ฟผ๋ฆฌ ์คํ์ ๊ณํ์ ์กฐํํ๋ค.
print(Entry.objects.filter(title="My Blog").explain())
reference: django document https://docs.djangoproject.com/en/5.2/
'Django-rest-framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [In-depth] django orm ํ ์คํธ์ฝ๋ ๊ด๋ จ (0) | 2025.09.30 |
|---|---|
| [Django] Django-Channels (0) | 2025.05.12 |
| JSONField ์ค๋ช ๋ฐ ๋์๋ฐฉ์ (0) | 2023.11.03 |
| exists ๋๊ฐ์ง ๋ฐฉ์ (0) | 2023.03.30 |
| swg_serializers ๊ด๋ จ (0) | 2023.03.30 |