์ค๋์ 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๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ๋๋ค.