Django ORM #๐Ÿš€

ddalkigumยท2020๋…„ 12์›” 8์ผ
3

Django

๋ชฉ๋ก ๋ณด๊ธฐ
3/4
post-thumbnail

์ค€๋น„๋‚ด์šฉ

์šฐ์„  ๋ฐ์ดํ„ฐ๋Š” Django-seed๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์คฌ์Šต๋‹ˆ๋‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” mysql์„ ์‚ฌ์šฉ์ค‘์ž…๋‹ˆ๋‹ค

startswith๋‚˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋ฐ ํ•„์š”ํ•œ ๋‹จ์–ด๋“ค์€ ์žฅ๊ณ  ๊ณต์‹ํŽ˜์ด์ง€์—์„œ ๐Ÿ˜

https://docs.djangoproject.com/en/3.1/ref/models/querysets/

django์—์„œ sql๋ฌธ์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ๋ณด๊ณ ์‹ถ๋‹ค๋ฉด?

print(str(๋ณ€์ˆ˜.query))

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ sql์–ธ์–ด๋กœ๋Š” ์–ด๋–ป๊ฒŒ
์ž‘์„ฑ์ด ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

์‹œ์ž‘

or

ํ•ฉ์ง‘ํ•ฉ ํ‰์†Œ์— ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” or ๊ทธ๋Œ€๋กœ์—์š”

์œ„ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋ฉด ์ด๋ฆ„์ด a์™€ b๋กœ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ ๋‘˜๋‹ค ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”
์ฟผ๋ฆฌ์…‹์„ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ ์‚ฌ์ด์— | ๊ธฐํ˜ธ๋ฅผ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์š”

and

or๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๋‹ค ์ญ‰ ์ด์–ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์•Œ์•„์„œ ๊ตฌํ•ด์ค˜์š”
์žฅ๊ณ  ์™„์ „ ๋˜‘๋˜‘ํ•ด

์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ๋ฉด ์œ„์— ๋‚˜์˜จ or์—์„œ ์ฒ˜๋Ÿผ and์˜ ์—ฐ์‚ฐ์ž์ธ &์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ์š”

exclude

์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ์…‹์„ ๊ตฌํ•ด์ค˜์š”
๋ง์ด ์ข€ ์–ด๋ ค์šด ๋“ฏํ•œ๋ฐ ๋ฐ‘์— ์‚ฌ์ง„์„ ๋ณด๊ฒŒ๋˜๋ฉด ๋ฐ”๋กœ ์•Œ๊ฑฐ์—์š”

union

๋ฐ์ดํ„ฐ๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”
or๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์ ์ด ์žˆ์–ด์š”

or๊ณผ ๋‹ค๋ฅธ์ ์ด๋ผ๋ฉด
union์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ์ด๋ฆ„์˜ column์ด ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์š”

values ์™€ only

sql๋ฌธ๊ณผ ์ƒ๋‹นํžˆ ๋น„์Šทํ•˜๋‹ค๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”

๋ณด๊ฒŒ ๋˜๋ฉด sql๋ฌธ์€ ๊ต‰์žฅํžˆ ์ง๊ด€์ ์ด๋ผ ์–ด๋–ค ๊ฑธ ๋œปํ•˜๋Š”์ง€ ๋ฐ”๋กœ ์•„์‹ค๊ฑฐ์—์š”

๊ฐ™์€ ์ƒํ™ฉ์—์„œ only๋ฅผ ์“ธ ๊ฒฝ์šฐ

values์— id๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋ผ๊ณ  ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ
์ €์ ˆ๋กœ id๋กœ ๊ฐ™์ด ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฑธ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์–ด์š”

์ฟผ๋ฆฌ์…‹๋ฆฌ์ŠคํŠธ์—์„œ ์ˆœ์„œ ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ

์ œ์ผ ์œ„์ชฝ์— ๋‚˜์˜จ ๊ฒฐ๊ณผ๋Š” queryset2๋ฅผ
์ œ์ผ ๋ฐ‘์—์ชฝ ๊ฒฐ๊ณผ๋Š” queryset์„ ์ถœ๋ ฅํ•œ ๊ฒฐ๊ณผ

ํŒŒ์ด์ฌ์—์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋˜‘๊ฐ™์—์š”
๊ทธ๋Œ€๋กœ ์“ฐ์‹œ๋ฉด ๋˜์š”

annotate

์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ๋Š” ์ฒ˜์Œ ๋ณด๋Š”๊ฒŒ ๋“ฑ์žฅํ•ด์„œ ์กฐ๊ธˆ ๋‹นํ™ฉํ–ˆ์ง€๋งŒ,
๊ตฌ๊ธ€์˜ ๋„์›€์œผ๋กœ ์ œ๋Œ€๋กœ ์•Œ๊ฒŒ๋ฌ์–ด์š”

์ด ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‚˜์˜ค๋Š” queryset2๋Š” ๋ฌด์‹œํ•˜์‹œ๋ฉด ๋˜์š”
์ œ๊ฐ€ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ๋น„๊ตํ•ด ๋ณผ๋ ค๊ณ  ์จ๋†“์€ ๋ถ€๋ถ„์ด์—์š”

์šฐ์„  ์ฝ”๋“œ๋งŒ ๋ณด๊ฒŒ๋˜๋ฉด ์ด๊ฒŒ ๋ญ์ง€? ํ•˜์‹ค๋งŒํ•œ ๋ถ€๋ถ„์ด๋„ ํ•œ๋ฐ,
๋ณด๋ฉด name_count๋ฅผ ์ €๊ฑธ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  countํ•œ๊ฑธ ํ•„ํ„ฐ๋ฅผ ํ•ด์ค€๋‹ค๋ผ๊ณ  ์•„์‹คํ…๋ฐ...

๋งž์•„์š” ๊ทธ๊ฑฐ์—์š”

๊ทธ๋ž˜๋„ annotate๊ฐ€ ์ •ํ™•ํžˆ ์–ด๋–ค์ผ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ์œ„ํ•ด
sql๋ฌธ์„ ์ถœ๋ ฅ ํ–ˆ์–ด์š”

HAVING์ ˆ์„ ์ฐพ์•„๋ดค์Šต๋‹ˆ๋‹ค

๊ฑฐ๊ธฐ์„œ ์ง‘๊ณ„ํ•จ์ˆ˜๋ž€ ๋ง์ด ๋‚˜์™€ ์ง‘๊ณ„ํ•จ์ˆ˜๋„ ์ฐพ์•„๋ดฃ๋‹ค...

์ง‘๊ณ„ํ•จ์ˆ˜...

์ง‘๊ฒŒ...

์–˜๋Š” ์•„๋‹ˆ๊ตฌ์š”...

์ง‘๊ณ„ํ•จ์ˆ˜
COUNT SUM AVG STDDEV ๋“ฑ ์ง‘๊ณ„๋ฅผ ๋‚ผ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜

์ฐพ์•„ ๋ณด๋‹ค ๋ณด๋‹ˆ having๊ณผ group by์˜ ๋‹ค๋ฅธ์ ์— ๋Œ€ํ•œ ๊ธ€์ด ์žˆ์–ด ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค

GROUP BY

์ง‘๊ณ„ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ํ•„์š”์—†์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฌถ์Œ

HAVING
WHERE์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค
์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์กฐ๊ฑด๋น„๊ต๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

GROUP BY์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.

๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ  ๊ทธ์ค‘์—์„œ HAVING์—์„œ ์‚ฌ์šฉํ•œ ์ง‘๊ณ„ํ•จ์ˆ˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ทธ๋ฃน์„ GROUP BY๋กœ ๋ฌถ์–ด์ฃผ๋Š” ์‹์ด๋‹ค.

distinct

๊ณ ์œ ํ•œ ํ•„๋“œ๊ฐ’์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•ด์š”

๋งŒ์•ฝ์— ์œ ์ €๋„ค์ž„์ด ์œ ๋‹ˆํฌํ•œ ์‚ฌ๋žŒ์„ ์ฐพ๋Š”๋‹ค ๊ฐ€์ •ํ•œ๋‹ค๋ฉด

queryset = models.User.objects.all().filter(username="admin")

์ด๋Ÿฐ์‹์œผ๋กœ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ฒŸ์ง€๋งŒ
ํŠน์ • ๊ฐ’์„ ์ฐพ๋Š”๊ฒŒ ์•„๋‹Œ ๊ทธ๋ƒฅ ์œ ๋‹ˆํฌํ•œ ๊ฐ’๋งŒ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด

์œ„์—์„œ ์‚ฌ์šฉํ•œ annotate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฐพ์•„์ฃผ๋ฉด ๋œ๋‹ค .

queryset = User.objects.values(
    'username'
).annotate(
    name_count=Count('username')
).filter(name_count=1)

์œ„์—์„œ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ด๋ฉฐ, count๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฑธ ์ฐพ์•„์ฃผ๋ฉด
์ฟผ๋ฆฌ์…‹์„ ์ฐพ์•„์ค„ ์ˆ˜ ์žˆ๋‹ค.


์—ฌ๊ธฐ๊นŒ์ง€ ORM์— ๊ด€ํ•œ ๋‚ด์šฉ์ด๊ณ ,

์˜ค๋Š˜๋ถ€ํ„ฐ ์ผ์ฃผ์ผ์ •๋„๋Š” ORM์— ๊ด€ํ•œ๋‚ด์šฉ์„ ์ญ‰ ์ •๋ฆฌํ•ด๋ณด๊ณ 
์ดํ•ดํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

Django - Cookbook

https://django-orm-cookbook-ko.readthedocs.io/en/latest/

์—ฌ๊ธฐ์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
ํ•œ๊ธ€๋ฒˆ์—ญ์ด ๋˜์žˆ์–ด์„œ ๋ณด๊ธฐ ๋˜๊ฒŒ ์ข‹์•„์š” ๐Ÿ‘

์ค‘๊ฐ„์ค‘๊ฐ„ ์„ค๋ช…์ด ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๊ธดํ•œ๋ฐ,
๊ทธ๋Ÿฐ๋ถ€๋ถ„์€ ์กฐ๊ธˆ๋งŒ ์ฐพ์œผ๋ฉด ๊ธˆ๋ฐฉ ๋‚˜์˜ค๋‹ˆ๊นŒ ์ฐพ๊ธฐ ์‰ฌ์›Œ์š”

profile
๋”ธ๊ธฐ๊ฒ€ -๋ณธ์บ๐Ÿ’ , ๊น€์ค€ํ˜• - ํ˜„์‹ค ๋ณธ์บ ๐Ÿ’

0๊ฐœ์˜ ๋Œ“๊ธ€