๐ DBMS์์์ ๊ด๊ณ
๐ 1:N์์์ ๊ด๊ณ -> models.ForeignKey๋ก ํํ
๐ 1:1์์์ ๊ด๊ณ -> models.OneToOneField๋ก ํํ
๐ M:N์์์ ๊ด๊ณ -> models.ManyToManyField๋ก ํํ
๐ ForeignKey
1:N ๊ด๊ณ์์ N์ธก์ ๋ช ์ํฉ๋๋ค.
models.ForeignKey(to, on_delete)
๐ to : ๋์ ๋ชจ๋ธ
ํด๋์ค๋ฅผ ์ง์ ์ง์ ํ๊ฑฐ๋, ํด๋์ค๋ช ์ ๋ฌธ์์ด๋ก ์ง์ ํฉ๋๋ค. ์๊ธฐ ์ฐธ์กฐ๋ฅผ ํ ๋๋ self๋ก ์ง์ ํฉ๋๋ค.
๐ on_delete : Record ์ญ์ ์ Rule์ ์๋ฏธํ๋ค. ์๋์ ๊ฐ์ ๊ฐ๋ค์ ์ฌ์ฉ ํ ์ ์๋ค.
CASCADE | FK๋ก ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๋ชจ๋ธ์ Record๋ ์ญ์ (์ฅ๊ณ 1.X์์์ ๋ํดํธ๊ฐ) |
PROTECT | ProtectedError (IntegrityError ์์) ๋ฅผ ๋ฐ์์ํค๋ฉฐ, ์ญ์ ๋ฐฉ์ง |
SET_NULL | null๋ก ๋์ฒด. ํ๋์ null=True ์ต์ ํ์ |
SET_DEFAULT | ๋ํดํธ ๊ฐ์ผ๋ก ๋์ฒด. ํ๋์ ๋ํดํธ๊ฐ ์ง์ ํ์ |
SET | ๋์ฒดํ ๊ฐ์ด๋ ํจ์ ์ง์ . ํจ์์ ๊ฒฝ์ฐ ํธ์ถํ์ฌ ๋ฆฌํด๊ฐ์ ์ฌ์ฉ |
DO_NOTHING | ์ด๋ ํ ์ก์ X. DB์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค |
from django.db import models
class Post(models.Model):
message = models.TextField()
photo = models.ImageField(blank=True, upload_to ='app/post')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"<{self.pk}> {self.message}"
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
๐ ๋ง์ฝ ๋ค๋ฅธ App ์์์ ๋ชจ๋ธ์์ ์ฐธ์กฐํ ๊ฒฝ์ฐ์๋ to ๋ถ๋ถ์ "App.model_name" ์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ ํ๋ฉด ๋๋ค.
post = models.ForeignKey("App.model_name", on_delete=models.CASCADE)
๐ FK์์์ reverse_name
reverse ์ ๊ทผ ์์ ์์ฑ๋ช : default ๊ฐ์ "๋ชจ๋ธ๋ช ์๋ฌธ์_set" ์ ์ฌ์ฉํ๋ค. 1:N ๊ด๊ณ์์ 1 ์ธก์์ ์ฌ์ฉํ๋ ๊ฒ์ธ๋ฐ,
์๋ฅผ ๋ค์ด์ Post, Comment ๊ด๊ณ์์ post ๊ฐ์ฒด์ ๋ํ Comment ๊ฐ์ฒด์ ์ ๊ทผ ํ ๋ ์ฌ์ฉํ๋ค.
post.comment_set.all()
๐ OneToOneField
1:1 ๊ด๊ณ์์ ์ด๋ ์ชฝ์ด๋ผ๋ ๊ฐ๋ฅ, FK์ ์ ์ฌํ์ง๋ง, reverse๊ฐ ์๋ ์๋์ ์ฐจ์ด์ด๋ค.
models.OnetoOneField(to, on_delete)
๐ ManyToManyField
M:N ๊ด๊ณ์์ ์ด๋ ์ชฝ์ด๋ผ๋ ํ๋ ์ง์ ๊ฐ๋ฅ
ManyToManyField(to, blank=False)
Post-Tag ์์์ ๊ด๊ณ
from django.db import models
class Post(models.Model):
message = models.TextField()
photo = models.ImageField(blank=True, upload_to ='app/post')
# ์ผ๋ฐ์ ์ผ๋ก Tag๋ฅผ ์ฐ๋ฉด ํ์ด์ฌ์์ ์คํํ ๋ ํด๋์ค Tag๋ฅผ ์ธ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด "Tag"๋ก ํ๊ธฐํ๋ฉด ๋๋ค.
# ํ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์์ด์ ์ ํจ์ฑ ๊ฒ์ฌ์์ ์ฑ๊ณตํ๊ธฐ ์ํด์ blank=True ์ต์
์ ์ถ๊ฐํ๋ค.
tag_set = models.ManyToManyField('Tag', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"<{self.pk}> {self.message}"
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
def __str__(self):
return self.name
๐ ์ผ๋ฐ์ ์ผ๋ก M:N ๊ด๊ณ์์ MTMF ์ M ํน์ N ๋ฑ ์๋ฌด๊ณณ์ด๋ ํ๊ธฐํด์ค๋ ์ฌ์ฉ ์์ผ๋, ์ผ๋ฐ์ ์ผ๋ก ํ์ฉํ๋ ๊ณณ์ ํ๊ธฐํด์ฃผ๋ ๊ฒ์ด ์ข๋ค. (Post๊ฐ Tag๋ฅผ ์ฌ์ฉํจ์ผ๋ก Post ์ชฝ์ MTMF์ ํ๊ธฐ ํ์๋ค.)
๐ ์ผ๋ฐ์ ์ผ๋ก M:N ๊ด๊ณ์์๋ 2๊ฐ์ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, Django ์์๋ ์์์ ํ ์ด๋ธ์ ํ๋ ์์ฑํ์ฌ ๊ด๋ฆฌํ๋ค. ๊น๋ํ๊ฒ DB์ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ๋ฐ๋ก ํ ์ด๋ธ์ ํ๋ ๋ง๋ค์ด ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ ๋ฏ ํ๋ค.
'FrameWork > Django' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ERROR : django.db.utils.OperationalError: no such table ์ค๋ฅ ํด๊ฒฐ (0) | 2023.02.19 |
---|---|
[Django] ํจ์ ๊ธฐ๋ฐ View (0) | 2023.02.08 |
[Django] Model ๊ฐ์ฒด ์กฐํํ๊ธฐ (0) | 2023.02.08 |
[Django] shell ์ฌ์ฉํ๊ธฐ (0) | 2023.02.08 |
[Django] Django project ์์ ์ static, media ์ค์ ํ๊ธฐ (0) | 2023.02.08 |