ForeignKey, OneToOneField, ManyToManyField
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