TIL(22/12/06)

๊น€๊ทœํ˜„ยท2022๋…„ 12์›” 6์ผ
0

๐Ÿ’ป Today I Learned

์˜ค๋Š˜์€ ORM์„ ํ•˜๋˜ ์ค‘ ์—ญ์ฐธ์กฐ ๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์—์„œ ํ—ท๊ฐˆ๋ ค์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฆฌ๋งˆ์ธ๋“œ ์ฐจ์›์—์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณธ๋‹ค.

๐Ÿ“Œ Django ORM

Object-Relational-Mapping์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด(Object)์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Relational Database)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘(Mapping)ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL์„ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ sql์ฟผ๋ฆฌ๋ฌธ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

class Person(models.Model)
	name = models.CharField(max_length=10)
    
class Dog(models.Model)
	owner = models.ForeignKey(Person)
    name = models.CharField(max_length=20)

์œ„์™€ ๊ฐ™์ด ๋ชจ๋ธ์ด ์ •์˜๋˜์–ด ์žˆ์„ ๋•Œ ์‚ฌ๋žŒ๊ณผ ๊ฐœ๋Š” 1:N ๊ด€๊ณ„์ด๋‹ค.
Dog๊ฐ€ ForeignKey๋กœ Person์— ์—ฐ๊ฒฐ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— Person์€ ์—ฌ๋Ÿฌ Dog๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ Dog๋Š” ์—ฌ๋Ÿฌ Person์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์ œ๋กœ ์œ ์ €๊ณผ ๊ฒŒ์‹œ๊ธ€์ด ๋Œ€ํ‘œ์ ์ธ๋ฐ ์œ ์ €๋Š” ์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒŒ์‹œ๊ธ€์€ ์—ฌ๋Ÿฌ ์œ ์ €๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
์ด๊ฒƒ์ด one to many ๊ด€๊ณ„์ด๋‹ค.

๐Ÿ“Œ ์ •์ฐธ์กฐ

์ •์ฐธ์กฐ๋Š” ํ˜„์žฌ ๋ชจ๋ธ์—์„œ Foreignkey ํ•„๋“œ๋กœ ์—ฐ๊ฒฐ๋œ ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (one to one ๊ด€๊ณ„๋„ ํฌํ•จ๋œ๋‹ค)
์ฆ‰, Foreignkey๊ฐ€ ์žˆ๋Š” object์—์„œ ์—ฐ๊ฒฐ๋œ Foreignkey ์†์„ฑ์ด ์—†๋Š” object๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์ •์ฐธ์กฐ์ด๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋กœ ๋ณด๋ฉด Dog๊ฐ€ Foreignkey๋กœ Person์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ Person์˜ object๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ •์ฐธ์กฐ์ด๋‹ค.

์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐœ์˜ ์ฃผ์ธ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€ ๋ณธ๋‹ค.

# Dog ๋ชจ๋ธ๋กœ ์ƒ์„ฑ๋œ id๊ฐ€ 1๋ฒˆ์ธ ๊ฐ์ฒด๋ฅผ dog ๋ณ€์ˆ˜์— ๋‹ด์Œ
dog = Dog.objects.get(pk=1)

# ๊ฐ์ฒด์˜ owner๋Š” Person ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ณ  Person ๋ชจ๋ธ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ๋‹ค.
์ฃผ์ธ = dog.owner.name

๐Ÿ“Œ ์—ญ์ฐธ์กฐ

์—ญ์ฐธ์กฐ๋Š” ๋ฐ˜๋Œ€๋กœ ForeignKey ์†์„ฑ์ด ์—†์ง€๋งŒ ์—ฐ๊ฒฐ๋œ ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.
์ฆ‰, ์ฐธ์กฐ๋ฅผ ๋‹นํ•œ ๋ชจ๋ธ์—์„œ ์ฐธ์กฐ๋ฅผ ํ•œ ๋ชจ๋ธ์˜ object๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์—ญ์ฐธ์กฐ์ด๋‹ค.

์˜ˆ์ œ๋กœ ๋ณด๋ฉด Person ๋ชจ๋ธ์€ ForeignKey ํ•„๋“œ๊ฐ€ ์—†์ง€๋งŒ Dog์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ์—ฐ๊ฒฐ๋œ Dog์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์—ญ์ฐธ์กฐ์ด๋‹ค.

์—ญ์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ํ•˜๋‚˜๋Š” set_manager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ญ์ฐธ์กฐ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ related_name์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฃผ์ธ์ด ๊ฐ€์ง„ ๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณธ๋‹ค.

# Person ๋ชจ๋ธ๋กœ ์ƒ์„ฑ๋œ id๊ฐ€ 1๋ฒˆ์ธ ๊ฐ์ฒด๋ฅผ person์œผ๋กœ ์ง€์ •
person = Person.objects.get(pk=1)

# person ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Dog ๋ชจ๋ธ์„ dog_set์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ญ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  get์ด๋‚˜ all์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ Dog ๋ชจ๋ธ์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ด
1๋ฒˆ ๊ฐœ = person.dog_set.get(id=1)
์ฃผ์ธ์˜ ๋ชจ๋“  ๊ฐœ = person.dog_set.all()

# related_name ์‚ฌ์šฉ(related_name='dogs')
1๋ฒˆ ๊ฐœ  = person.dogs.get(id=1)
์ฃผ์ธ์˜ ๋ชจ๋“  ๊ฐœ = person.dogs.all()

set_manager๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ˜„์žฌ ๋ชจ๋ธ์—์„œ ์ฐธ์กฐ๋ฅผ ํ•œ ๋ชจ๋ธ์„ ์ฐพ์•„๊ฐ€๋Š” ๋ฐฉ์‹์ธ๋ฐ ๋งŒ์•ฝ ํ˜„์žฌ ๋ชจ๋ธ์—์„œ ์ฐธ์กฐ๋ฅผ ํ•œ ๋ชจ๋ธ์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ์–ด๋–ค ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•˜์ง€๋งŒ related_name์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ๋ชจ๋ธ์„ ์ฐธ์กฐํ•œ ํ•„๋“œ๋ฅผ ์ฐพ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ์ง๊ด€์ ์ด๋ฉฐ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ๊ฐ„ํŽธํ•˜๊ณ , ์œ„์—์„œ ๋งํ•œ ์—๋Ÿฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— related_name์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ์•ˆ์ „ํ•˜๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์˜ค๋Š˜ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด์„œ ๊ฒช์€ ๊ฒฝํ—˜์ธ๋ฐ, related_name์ด ์„ค์ •๋œ ์ƒํƒœ์—์„œ set_manager๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๋‚œ๋‹ค.

profile
์›น๊ฐœ๋ฐœ ํšŒ๊ณ ๋ก

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