🌝 본 포스트는 리액트와 함께 장고 시작하기 Complete + 별도로 공부한 내용으로 이루어져있습니다
1 : N 관계에서 N측에 명시
to
: 대상모델 (클래스 직접 지정하거나 문자열로도 지정 가능)
on_delete
: 1 측 record가 삭제될 때 N측인 데이터를 어떻게 처리할 것 인지?
CASCADE
: 이와 연결되어있는 N측 데이터 삭제PROTECT
: 1인 쪽인 데이터가 삭제되지 않도록 방지SET_NULL
: null로 대체, 필드에 null=True 옵션이 있어야만 가능SET_DEFAULT
: default로 대체, 필드에 detault=True 옵션이 있어야 가능SET
: 대체할 값이나 함수를 지정DO_NOTHING
: 아무것도 하지 않음, DB에 따라 오류 발생할 수 있음 장고의 User 모델이 변경될 수 있으므로 ForeignKey로 참조해야 할 때
import 및 직접 참조(auth.User)해서 쓰는 것 비추천
class Post(models.Model):
#...
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
#...
settings.py
에 AUTH_USER_MODEL
설정 AUTH_USER_MODEL = '<앱_이름>' #default는 auth.User
models.py
에서 사용 from django.conf import settings
class Post(models.Model):
#...
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE)
#...
모델명소문자_set
# Post와 Comment는 1 : N 관계
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE) #post_id 생성
message = models.TextField()
>>> post = Post.objects.last()
>>> Comment.objects.filter(post=post)
>>> post.comment_set.all()
dictionary 형태로 1인 쪽의 필드와 필드값 걸어줌
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, limit_choices_to = {'is_published': True}
M : N 관계
방법 1 (추천)
class Post(models.Model):
#...
tag_set = models.ManyToManyField('Tag', blank=True)
#...
class Tag(models.Model):
#...
name =models.CharField(max_length=50, unique=True)
#...
class Post(models.Model):
#...
class Tag(models.Model):
#...
name =models.CharField(max_length=50, unique=True)
post_set = models.ManyToManyField(Post, blank=True)
#...