๋ฐ์ดํฐ๋ฒ ์ด์ค๋?1. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB, Relational Database)1.1 ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข
๋ฅ1.2 ํค์ ๊ฐ๋
๊ณผ ์ข
๋ฅ1.3 ํ
์ด๋ธ1.5 Django์ ๋ฐ์ดํฐ๋ฒ ์ด์ค2. ERD2.1 ๊ด๊ณ2.2 1:N, ์ธ๋ํค2.3 N:M2.3 1:13. shell_plus
- ์ด ์ฑํฐ์ ์ ์ฒด ์์ค์ฝ๋
๋ฐ์ดํฐ๋ฒ ์ด์ค๋?
๋ฐ์ดํฐ๋ฒ ์ด์ค(database, DB)๋ ์ฌ๋ฌ ์ฌ๋๋ค์ด ๊ณต์ ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ ๋ฐ์ดํฐ๋ค์ ์งํฉ์
๋๋ค.
1. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDB, Relational Database)
ํ์
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์ฒ๋ผ ํ
์ด๋ธ์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ๋ฅผ ํตํด ๋ฐ์ดํฐ ์งํฉ์ ํํํ๋ ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์
๋๋ค.
1.1 ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ๋ฅ
- ๊ณ์ธตํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(1:N)
- ๋งํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(N:M)
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(๋จ์ํ ํ ํํ์ ์ํธ ๊ด๊ณ, 1:1, 1:N, N:M๊ด๊ณ ํํ)
- ๊ฐ์ฒด ์งํฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
1.2 ํค์ ๊ฐ๋ ๊ณผ ์ข ๋ฅ
- ๊ธฐ๋ณธํค๋ ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ ํค๋ฅผ ๋งํฉ๋๋ค. ๊ณ ์ ํ(์ ์ผํ) ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๋, ๊ณ์ข๋ฒํธ, ์ ํ๋ฒํธ ๋ฑ์ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธํค๋ NULL์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ๋ณดํค๋ ๊ธฐ๋ณธํค๋ฅผ ์ ์ธํ๊ณ ๊ณ ์ ํ ํค๋ค์ ๋งํฉ๋๋ค.
- ์ธ๋ํค๋ ๊ด๊ณ๋์ด ์๋ ํ ์ด๋ธ์์ ์ฐธ๊ณ ํ๊ณ ์๋ ํค๋ฅผ ์๊ธฐํฉ๋๋ค. ์ฌ๊ธฐ์ ํ์ ๋ฆด๋ ์ด์ ๊ณผ ์๊ฐ์ ์ฒญ ๊ณผ๋ชฉ ๋ฆด๋ ์ด์ ์ ์๋ก ํ๋ฒ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ฃ .
1.3 ํ ์ด๋ธ

- ํํ(Tuple)์ ํ ์ด๋ธ์ ํ์ ๋๋ค.
- ์์ฑ(Attribute)์ HTML๋ก ๋ฐ์ง์๋ฉด Table Heading ์ ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋ฒ, ์ด๋ฆ, ์ฃผ์, ์ ํ๋ฒํธ๊ฐ ์์ฑ์ด์ฃ .
- ๋๋ฉ์ธ(Domain)์ ํ๋์ ์์ฑ์์ ์ทจํ ์ ์๋ ๊ฐ์ ๋ฒ์๋ฅผ ๋งํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์์๋ ์ ์ฒญ ๊ณผ๋ชฉ์์ ์ ์ฒด ๊ณผ๋ชฉ์ ๋ฒ์๋ฅผ ์๊ธฐํฉ๋๋ค.
- ์ฐจ์(Degree)๋ ์์ฑ์ ๊ฐ์์ ๋๋ค. ํ์ ๋ฆด๋ ์ด์ ์์๋ ํ๋ฒ, ์ด๋ฆ, ์ฃผ์, ์ ํ๋ฒํธ์ด๋ ์ด 4๊ฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
- ๊ธฐ์(Cardinality)๋ ํํ์ ๊ฐ์์ ๋๋ค. ์์์๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ ์ธํ๊ณ ์ด 5๊ฐ์ ํํ์ด ์กด์ฌํฉ๋๋ค.
1.5 Django์ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ฅ๊ณ ์์๋ ORM์ด๋ผ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ด์ฌ ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๋, ํ
์ด๋ธ๊ณผ ๋์๋๋ ๊ฒ์ด ์ฅ๊ณ ์ ๋ชจ๋ธ(Model)์
๋๋ค.
์์ ํ์์ ๋ํ ํ
์ด๋ธ์ ์ฅ๊ณ ์ ๋ชจ๋ธ๋ก ํํํด๋ณด๊ฒ ์ต๋๋ค.
from django.db import models class Student(models.Model): number = models.IntegerField("ํ๋ฒ") name = models.CharField("์ด๋ฆ", max_length=20)
์์
Student
ํด๋์ค๊ฐ ํ์ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ธ์
๋๋ค. ํ
์ด๋ธ์์ ํ๋ฒ
, ํ๊ณผ
, ์ด๋ฆ
๊ฐ์ ๊ฐ ์ปฌ๋ผ(column)์ ์์ฑ(Attribute)์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ด๋ ์ฅ๊ณ ๋ชจ๋ธ์์ ํ๋์ ๋์๋ฉ๋๋ค. number
, department
, name
์ด ๊ทธ๊ฒ์
๋๋ค.2. ERD
ERD(Entity Relation Diagram)๋ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก, ์ฌ๊ธฐ์ ๊ฐ์ฒด๋ ๊ด๊ณํ DB์์ ํ
์ด๋ธ๋ก ํํ๋ ์ ์๋ ๊ฐ๋
์ ๋ปํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์์๋ 'ํ์'์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ํ
์ด๋ธ๋ก ํํํ ๊ฒ์
๋๋ค. 'ํ์'์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ERD๋ก ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.

์ฌ๊ธฐ์ id๋ ๊ธฐ๋ณธํค(Primary Key, PK)๋ก ๊ฐ์ฒด๋ค ๊ฐ์ ๊ตฌ๋ณํ ์ ์๋๋ก ๊ฒน์น์ง ์๊ฒ๋ ์ ํ๋ ์๋ณ์ ์ญํ ์ ์์ฑ์
๋๋ค. ์๋
ํ๋ฒ
์ด ๊ทธ๋ฌํ ์ญํ ์ ์ํํ ์ ์์ง๋ง ์ฅ๊ณ ์์๋ PK๋ฅผ ๋ฐ๋ก ์ค์ ํ์ง ์์๋ ์๋์ผ๋ก id
๋ผ๋ ์ด๋ฆ์ PK ํ๋๋ฅผ ์์ฑํด์ค๋๋ค.ย
ERD๋ ERDcloud ๊ฐ์ ์๋น์ค์์ ์ฝ๊ฒ ์์ฑํ์ค ์ ์์ต๋๋ค. ํ
์คํธ๋ก ๋ ์๋น์ค๋ ChatGPT์ ์ฌ์ฉํ๊ธฐ ์ข์ต๋๋ค.
2.1 ๊ด๊ณ
์ด๋๊น์ง ๊ฐ์ฒด(Entity)์ ๋ํด์ ๋ค๋ฃจ์์ผ๋ ์ด์ ๋ ๊ด๊ณ(Relation)์ ๋ํด ์ด์ผ๊ธฐํ ์ฐจ๋ก์
๋๋ค. ํ์์ด๋ผ๋ ๊ฐ์ฒด๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฅผํ
๋ฉด ํ๊ณผ๋ผ๋ ๊ฐ์ฒด๊ฐ ๊ทธ๋ ์ต๋๋ค.
ํ๊ณผ
ํ๊ณผ๋ช
ํ๊ณผ์ฅ
ํ
์ด๋ธ ๊ฐ ๊ด๊ณ๋ฅผ ๋ง์ ์ ์์ผ๋ฉฐ ๊ทธ ์ข
๋ฅ๋ ์๋์ ๊ฐ์ต๋๋ค.
1 : N
: ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ด ๋ฌ๋ฆด ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒ์ํ๊ณผ ๊ฒ์ํ ๋๊ธ์ ๊ด๊ณ๋ก ๋ณผ ์ ์์ต๋๋ค. ๊ฒ์ํ ํ๋์ ์ฌ๋ฌ๊ฐ์ ๋๊ธ์ด ๋ฌ๋ฆฌ๋๊น์.
N : M
: ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ ๋ค์ค์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ด ๋ฌ๋ฆฌ๋ ๊ตฌ์กฐ์ ๋๋ค.
1 : 1
: ํ๋์ ํ ์ด๋ธ์ ํ๋์ ํ ์ด๋ธ์ด ๋งค์นญ๋๋ ๊ตฌ์กฐ์ ๋๋ค.
Django์์ model์ ํตํ ๊ด๊ณ๋ฅผ ํ์ํ ๋ ์๋ฐฉํฅ์ผ๋ก ์ ์๊ฐ ํ์ํ ๊ฒ ๊ฐ์ง๋ง, ํ์ชฝ ํด๋์ค์์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
2.2 1:N, ์ธ๋ํค
๊ฐ ํ์๋ค์ ์์ ์ ์ฃผ์ ๊ณต ํ๊ณผ๊ฐ ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ์ ๊ฐ์ฒด์ ํ๊ณผ ๊ฐ์ฒด ์ฌ์ด์๋ ๊ด๊ณ๊ฐ ์กด์ฌํฉ๋๋ค. ์ง๊ธ ํ๊ณผ:ํ์์ ๊ด๊ณ๋ฅผ 1:N์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค. ํ ํ์์ ์ฃผ์ ๊ณต์ ์ค๋ก์ง 1๊ฐ๋ง ๊ฐ์ง ์ ์๋ ํํธ, ํ ํ๊ณผ์๋ ์ฌ๋ฌ ํ์์ด ์์ต๋๋ค. ์ด๋ฅผ ERD๋ก ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.

ํ์ ๊ฐ์ฒด๊ฐ ํ๊ณผ ๊ฐ์ฒด์ PK ๊ฐ์ '์ฐธ์กฐ'ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ธ๋ถ์์ ๊ฐ์ ธ์จ ํค๋ผ๊ณ ํด์ ์ธ๋ํค(Foreign Key, FK)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. ์ฅ๊ณ ์์๋ 1 : N์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ธฐ ์ํด ForeignKey๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ ForeignKey ํ๋๋ 1์ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ N์ ์ ์ํฉ๋๋ค.
์ด๋ฒ์๋ ์ด๋ฅผ ์ฅ๊ณ ์ ๋ชจ๋ธ๋ก ํํํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๋์ฌ
e.
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ํด๋น ๋ชจ๋ธ์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ์์ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. Django์์ ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ ๋, ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ด์ ๋ชจ๋ธ์ ์ฐธ์กฐํ๋ฉด ๋จ์ํ ๋ชจ๋ธ์ ์ด๋ฆ๋ง ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ์ฐธ์กฐํ๋ ค๋ ๋ชจ๋ธ์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ์๋ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์
๋ช
.๋ชจ๋ธ๋ช
ํํ๋ก ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ๋ช
์ํด์ผ ํฉ๋๋ค.from django.db import models # ํ์ class Student(models.Model): number = models.IntegerField("ํ๋ฒ") name = models.CharField("์ด๋ฆ", max_length=20) major = models.ForeignKey(verbose_name="์ฃผ์ ๊ณต", to='e.Department', on_delete=models.SET_NULL, null=True) def __str__(self): return self.name # ํ๊ณผ class Department(models.Model): name = models.CharField("ํ๊ณผ๋ช ", max_length=20) head = models.CharField("ํ๊ณผ์ฅ", max_length=20) def __str__(self): return self.name
on_delete์ต์
์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฌป๋ ๊ฐ์
๋๋ค.
- CASCADE : ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๊ฐ ์ญ์ ๋๋ฉด ํด๋น ๊ฐ์ฒด๋ ํจ๊ป ์ญ์
- PROTECT : ํด๋น ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๊ฐ ์ญ์ ๋์ง ์์
- SET : ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ง ์ญ์ ํ๊ณ , ํด๋น ๊ฐ์ฒด๋ ์ง์ ํ๊ณ ์๋ ๊ฐ์ผ๋ก ์ค์
- SET_DEFAULT : ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ง ์ญ์ ํ๊ณ , ํด๋น ๊ฐ์ฒด๋ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ค์
- SET_NULL : ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ง ์ญ์ ํ๊ณ , ํด๋น ๊ฐ์ฒด๋ None๊ฐ์ผ๋ก ์ค์
- DO_NOTHING : ์๋ฌด๊ฒ๋ ํ์ง ์์
2.3 N:M
๊ด๊ณ์์๋ ํญ์ 1:N๋ง ๋ํ๋๋ ๊ฑด ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ค ๊ฐ์์๋ง ๊ด๊ณ๊ฐ ํ์ฑ๋๋ ๊ฒ๋ ์๋๋๋ค. ์๊ธฐ ์์ ๊ณผ๋ ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ก ํ์๋ค ๊ฐ์ ์น๊ตฌ ๊ด๊ณ๊ฐ ๊ทธ๋ ์ต๋๋ค. ํ์ ํ ๋ช
์ ์ฌ๋ฌ ๋ช
์ ์น๊ตฌ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ํํธ์ผ๋ก๋ ๊ทธ ํ์์ ์ฌ๋ฌ๋ช
์๊ฒ ์น๊ตฌ์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ด๊ณ๋ฅผ N:M ์ด๋ผ ํํํ๊ณ ์ด๋ฅผ ERD๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.

๋ณด์๋ฉด '์น๊ตฌ๊ด๊ณ'๋ผ๋ ํ
์ด๋ธ์ ํ๋ ๋ ๋ง๋ค์์ต๋๋ค. N:M ๊ด๊ณ์์๋ ์ด๋ฌํ ์ค๊ณ ํ
์ด๋ธ์ด ํ์ ์
๋๋ค. ์๋ํ๋ฉด ํ ์์ฑ์๋ ํ๋์ ๊ฐ๋ง ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ ์ธ๋ํค๋ฅผ ํ์ ํ
์ด๋ธ์ ๋ฃ๋๋ค๋ฉด ์น๊ตฌ๊ฐ ์ฌ๋ฌ ๋ช
์ผ ์ ์ฌ๋ฌ PK ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋๋ฐ ์ด๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ ๋์ ์ค๊ณ ํ
์ด๋ธ์ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ์ ์น๊ตฌ ๊ด๊ณ๋ฅผ pk๋ผ๋ฆฌ ์ง์ง์ด์ ์ ์ฅํฉ๋๋ค.
์ด๋ฅผ ์ฅ๊ณ ์ ๋ชจ๋ธ๋ก ํํํด ๋ด
๋๋ค.
from django.db import models # ํ์ class Student(models.Model): number = models.IntegerField("ํ๋ฒ") name = models.CharField("์ด๋ฆ", max_length=20) major = models.ForeignKey(verbose_name="์ฃผ์ ๊ณต", to='e.Department', on_delete=models.SET_NULL, null=True) friends = models.ManyToManyField(verbose_name="์น๊ตฌ๋ค", to='self', db_table='e_friendship', blank=True) def __str__(self): return self.name
์ฅ๊ณ ์ ManyToManyField๋ฅผ ์ด์ฉํด ์ฝ๊ฒ N:M ๊ด๊ณ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. Student ํด๋์ค์ ์ง์ ๋ค์ด๊ฐ์ง๋ง ์ด๋ ๊ด๊ณ๋ฅผ ๋ช
์ํ ๋ฟ ์ค์ DB์๋ Student ํ
์ด๋ธ์ friends๋ผ๋ ์์ฑ์ ์๊ฒจ๋์ง ์์ต๋๋ค. ๊ทธ ๋์
e_friendship
์ด๋ผ๋ ์ค๊ณ ํ
์ด๋ธ์ด ์์ฑ๋๊ณ ํ์์ pk๋ฅผ ์ฐธ์กฐํ๋ ๋ ๊ฐ์ ์ธ๋ํค๋ฅผ ๊ฐ์ง๋๋ค.
๋ ํ
์ด๋ธ ๋ชจ๋ ManyToMany ํ๋๋ฅผ ๊ฐ์ง๊ณ ์์ด์๋ ์๋ฉ๋๋ค.
ย
makemigrations์ migrate๋ฅผ ํ๊ณ admin์์ ํ์ธํด๋ณด์ธ์. admin.py์์ ์๋ ์ฝ๋๋ฅผ ์
๋ ฅํด์ผ ํฉ๋๋ค.
from django.contrib import admin from .models import Student, Department admin.site.register(Student) admin.site.register(Department)

2.3 1:1
1:1 ๊ด๊ณ๋ ์ค์ต์ ํ์ง ์์ต๋๋ค.
1:1 ๊ด๊ณ๋ OneToOneField๋ก ํํ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ForeignKey์์ unique=True ์ต์
์ ์ค ๊ฒ๊ณผ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค. ์์ ์ค์ต์์ ์งํํ ๊ฒ์ StudentCard๋ฅผ ๋ง๋ค์ด 1:1 ๊ด๊ณ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํ์์๊ฒ๋ ์ ์ผํ ํ์ ์นด๋๊ฐ ๋งค์นญ์ด ๋๋๊น์.
ย
from django.db import models # ํ์ ๋ชจ๋ธ class Student(models.Model): number = models.IntegerField("ํ๋ฒ") name = models.CharField("์ด๋ฆ", max_length=20) major = models.ForeignKey(verbose_name="์ฃผ์ ๊ณต", to='Department', on_delete=models.SET_NULL, null=True) friends = models.ManyToManyField(verbose_name="์น๊ตฌ๋ค", to='self', db_table='e_friendship', blank=True) def __str__(self): return self.name # ํ์์นด๋ ๋ชจ๋ธ class StudentCard(models.Model): student = models.OneToOneField(Student, on_delete=models.CASCADE, related_name='card') studentCardID = models.IntegerField() def __str__(self): return str(self.studentCardID)
ย
3. shell_plus
์ฅ๊ณ shell์ ๋ถํธํ ์ ์ ํ์ํ ๋ชจ๋ธ์ด ์์ผ๋ฉด ํญ์
import
๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค๋ ์ ์
๋๋ค.ํ์ง๋ง
django-extensions
๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํ๋ฉด shell_plus
๋ผ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ฅ๊ณ shell๊ณผ ๋์ผํ์ง๋ง, ์คํ ์ ํด๋น ํ๋ก์ ํธ ๋ด์ ํ์ํ ๊ฒ๋ค์ ์๋์ผ๋ก import
ํด์ค๋ค๋ ์ ์
๋๋ค.django-extensions
๋ฅผ ๋จผ์ ์ค์นํด์ค๋๋ค.
pip install django-extensions

ย
- ํด๋น ํ๋ก์ ํธ์
settings.py
์INSTALLED_APPS
์django_extensions
๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ค์น ํ ๋์ ๋ค๋ฅด๊ฒ-
(dash)๊ฐ ์๋๋ผ_
(underscore)๋ผ๋ ์ ์ ์ ์ํฉ๋๋ค.
INSTALLED_APPS = [ ..., 'django_extensions', ..., ]
ย
- ์ด์
shell_plus
๋ฅผ ์คํ์์ผ ๋ด ๋๋ค.
python manage.py shell_plus
ย
์ฌ์ง๊ณผ ๊ฐ์ด ํ๋ก์ ํธ๋ฅผ ๋ค๋ฃจ๋๋ฐ ํ์ํ ๋ชจ๋๋ค์ ์คํ๋ง ์์ผ๋ ์๋์ผ๋ก
import
ํด์ค๋๋ค.ย

ย
์ฝ๋๊ฐ ๊ธธ์ด ์ด ์ฑํฐ์ ์ฃผ์ํ ์ถ๋ ฅ ๋ด์ฉ๋ง ๊ธฐ์ ํฉ๋๊ฐ ๊ธธ์ด ์ด ์ฑํฐ์ ์ฃผ์ํ ์ถ๋ ฅ ๋ด์ฉ๋ง ๊ธฐ์ ํฉ๋๋ค.
>>> Student.objects.filter(pk=1) <QuerySet [<Student: ์ดํธ์ค>]> >>> q = Student.objects.filter(pk=1) >>> q >>> type(q) >>> dir(q) >>> q[0] >>> q[0].name #str ์ ๋๋ค. >>> type(q[0]) >>> dir(q[0]) >>> q[0].major <Department: ์ปดํจํฐ๊ณตํ๊ณผ> >>> q[0].major_id 1 >>> type(q[0].major) <class 'e.models.Department'> >>> dir(q[0].major) >>> q[0].major.name '์ปดํจํฐ๊ณตํ๊ณผ' >>> q[0].friends <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<lo cals>.ManyRelatedManager object at 0x7f2e8ac369d0> >>> type(q[0].friends) <class 'django.db.models.fields.related_descriptors.create_forward_many_to_many_mana ger.<locals>.ManyRelatedManager'> >>> dir(q[0].friends) >>> q[0].friends[0] # Error >>> q[0].friends.values() <QuerySet [{'id': 2, 'number': 2, 'name': 'ํํธ์ค', 'major_id': 1}, {'id': 3, 'numbe r': 3, 'name': '์ตํธ์ค', 'major_id': 1}]>
์ข์ ๊ธ