ForeignKey

- 1:N 관계

class Post(models.Model):
  # 생략
class Comment(models.Model):
  post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comment1')

→ 관계 모델 1 : 해당 모델 N 관계임 (1:N 중에서 N 인 쪽에서 ForeignKey 관계를 선언)

● ForeignKey(모델, on_delete, [옵션])

 - 모델 : 관계를 맺을 모델

 - on_delete : 관계맺은 모델이 삭제될 때 취할 행동 (1인 쪽의 데이터 삭제시, N 인 쪽의 데이터를 어떻게 처리할 지에 대한 설정)

 - related_name : 닉네임설정

● 상대 모델에 접근방법

# N -> 1
comment.post

# 1 -> N
post.comment_set
post.comment1		# related_name 설정시

→ N쪽이 여러개이기에 set으로 접근

→ related_name 설정시 설정한 이름으로 접근가능

OneToOneField

- 1:1 관계

class User(AbstractBaseUser):
  # 생략

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

● 상대 모델에 접근방법

user.profile

profile.user

→ 1:1 대응이기에 양쪽에서 바로 접근가능

ManyToManyField

- N:M 관계

# case 1
class Post(models.Model):
  tag = models.ManyToManyField('Tag',blank=True)
 
class Tag(models.Model):
  # 생략
  
# case 2
class Post(models.Model):
  # 생략
 
class Tag(models.Model):
  post = models.ManyToManyField(post,blank=True)

→ 양쪽다 N이기에 어느 쪽에서 설정해도 상관없음

● 상대 모델에 접근방법


● View (DB에 저장시)

 - ManytoManyField의 경우 칼럼에 직접 값을 넣지 않고 add()나 set()을 사용함

address_number = AddressNumber(name=customer.first_name,
                               phone=customer.username,
                               group=group,				# XXXXX
                               user=user)
address_number.save()
address_number = AddressNumber(name=customer.first_name,
                               phone=customer.username,
                               user=user)
address_number.save()
address_number.group.add(group)					# OOOOO