Many To One, One To Many, Many To Many

Error Coder·2022년 12월 2일
0

one to many 혹은 many to one 관계

  • ForeignKey를 이용해야함

이 관계가 사용되는 예시

  • 한 명의 주인이 여러마리의 고양이를 소유하는 경우

  • 한 명의 사용자가 여러개의 사진을 올릴 수 있는 경우

  • 한명의 사용자가 여러개의 댓글을 소유하는 경우 = 댓글 여러개가 한명의 사용자를 가지는 경우

  • 한 개의 사진이 여러개의 댓글을 갖는 경우

  • 한개의 사진이 여러개의 좋아요를 갖는(받은) 경우

모델을 이용한 이해

  • 한명의 주인이 여러마리의 고양이를 소유하는 경우를 모델로 설계하면 아래와 같음
  1. Owner 모델 정의
from django.db import models

class Owner(models.Model):
    name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.IntegerField()
  1. Cat 모델에 ForeinKey 를 추가해줌
from django.db import models
from . import Owner
    
class Cat(models.Model):
    name = models.CharField(max_length=30)
    breed = models.CharField(max_length=20)
    grumpy = models.BooleanField(default=False)
    owner = models.ForeignKey(Owner, null=True)  // Owner의 ID필드값이 들어감
  1. Owner 만들기
nicolas = Owner.objects.create(
    name = "Nicolas",
    last_name = "Serrano",
    age = 78
)
  1. 고양이들에게 위에서 만든 Owner 할당 해주기
bunns = Cat.objects.get(id=2)
bunns.owner = nicolas
bunns.save()

conrad = Cat.objects.get(id=3)
conrad.owner = nicolas
conrad.save()
  1. 아래는 foreign key로 연결된 경우 가능한 것을 보여준다.
    1) Cat의 정보에서 Owner의 정보를 얻는 것.
bunns = Cat.objects.get(id=2)
print(bunns.breed)           # British 
print(bunns.owner.age)       # 78      -> foreign key로 연결된 정보를 가져올 수도 있음

2) Owner의 정보에서 Cat의 정보를 얻는 것.

  • Django는 자동적으로 modelName_set이라고 불리는 클래스 속성을 만들어 foreign key가 향하는 모델의 속성으로 추가해줌.
  • 따라서, Cat 객체 안에 foreign key가 있다면 이 foreign key는 Owner 모델로 향하고 Owner 모델은 새로운 속성을 갖게 된다.
    그 이름은 cat_set이다.
nocolas = Owner.objects.get(pk=1)
noco_cats = nocolas.cat_set.all()

many to many 관계

  • ManyToManyField를 이용해야함

  • ForeignKey는 빈칸으로 비어있으면 안돼서 null=True를 해줬는데,
    ManyToManyField는 비어있어도 돼서 아무것도 안해줘도 됨.

이 관계가 사용되는 예시

  • 다수의 사용자들이 다수의 사용자들을 팔로우 할 수 있는 경우

모델을 이용한 이해

  • 어떤 한 사용자는 누군가를 팔로잉 할 수 있고, 또 다른 사람은 이 사람을 또 팔로잉 할 수 있을 경우를 모델로 설계하면 아래와 같음.
  1. Owner 모델 정의
  • many to many 관계, 즉, 팔로우, 팔로잉 기능에서는 User가 User로 향해야 하기 때문에 본인을 향할 수 밖에 없다.
  • one to many 혹은 many to one 관계에서 cat_set에 대한 언급이 있었는데,
    위에서 cat_set은 실제 테이블에 추가되지는 않았다.
    그런데, many to many 관계에서는 이것이 필드로써 실제 테이블에 추가된다.
from django.db import models

class Owner(models.Model):
    name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    age = models.IntegerField()
    following = models.ManyToManyField('self')
    followers = models.ManyToManyField('self')
  1. Owner 생성
Owner.objects.create(
    name = "Pedro",
    last_name = "Gomez",
    age = 44
)

Owner.objects.create(
    name = "Jisu",
    last_name = "Kimchi",
    age = 12
)

Owner.objects.create(
    name = "Manico",
    last_name = "Machiavelli",
    age = 44
)
  1. Jisu와 Pedro가 Nicolas를 팔로잉 하게함
nicolas = Owner.objects.get(pk=1)
pedro = Owner.objects.get(pk=2)
jisu = Owner.objects.get(pk=3)

nicolas.followers.add(jisu, pedro)
profile
개발자 지망생

0개의 댓글