관리 메뉴

Storage Gonie

Django (21) Model Relationships(one to many, many to many 관계) 본문

웹개발/인스타 클론 (1) Django

Django (21) Model Relationships(one to many, many to many 관계)

Storage Gonie 2019. 6. 28. 14:46
반응형

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()

2. 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필드값이 들어감

3. Owner 만들기

nicolas = Owner.objects.create(
    name = "Nicolas",
    last_name = "Serrano",
    age = 78
)

4. 고양이들에게 위에서 만든 Owner 할당 해주기

bunns = Cat.objects.get(id=2)
bunns.owner = nicolas
bunns.save()

conrad = Cat.objects.get(id=3)
conrad.owner = nicolas
conrad.save()

5. 아래는 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')

2. 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
)

3. 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)

반응형
Comments