ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데일리 과제 3
    장고 2023. 7. 21. 12:10

    데이터 테이블 간의 관계를 나타내는 FK, OneToOne, ManyToMany 필드에 대해서 설명하시오

    • FK(Foreign Key)
      한국어로 외래키 관계, 혹은 일대다(1:N) 관계라고 부릅니다. 외래키는 한 테이블과 다른 테이블간의 관계를 나타내는 개념으로, 외래키로 연결된 다른 테이블의 기본키(Primary Key)를 참조합니다.
      예를 들어 한 유저가 여러 개의 게시글을 작성할 수 있을 때, 게시글을 유저와 외래키로 참조합니다. 한 유저는 여러 개의 게시글을 작성할 수 있지만, 한 게시글은 여러 명의 유저를 가질 수 없습니다. 이러한 관계를 FK 관계라고 설명합니다.
    • OneToOne
      한국어로 일대일(1:1) 관계라고 부릅니다. 한 테이블의 레코드가 다른 테이블의 레코드와 1:1로 매핑되는 경우 사용됩니다.
      예를 들어 한 유저가 하나의 프로필을 가질 수 있을 때, 유저와 프로필을 OneToOne 관계라고 설명할 수 있습니다.
    • ManyToMany
      한국어로 다대다 관계라고 부릅니다. 이 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 매핑되고, 그 반대도 성립하는 경우에 사용됩니다.
      예를 들어 한 유저가 여러 그룹에 속할 수 있고, 한 그룹에 여러 명의 유저가 속할 수 있을때, 이 관계를 ManyToMany 관계라고 설명할 수 있습니다.

     

     

    Django에서 ManyToMany필드를 만드는 방법에 대해서 설명하시오

    Django에서 ManyToMany 관계를 구현하려면, ManyToManyField를 사용하면 됩니다.

    먼저 ManyToMany로 연결할 두 모델을 생성합니다.

    from django.db import models
    
    
    class User(models.Model):
        name = models.CharField("이름", max_length=20)
        age = models.PositiveIntegerField("나이")
        gender = models.CharField("성별", max_length=10)
        
    
    class Group(models.Model):
        name = models.CharField("이름", max_length=20)

    유저와 그룹이라는 모델을 생성했습니다. 한 유저가 여러 그룹에 속할 수 있고, 한 그룹에 여러 유저가 속할 수 있게 하려면 두 모델을 ManyToMany 관계로 엮어야 합니다. 이 때 ManyToManyField를 사용하면 됩니다.

    from django.db import models
    
    
    class User(models.Model):
        name = models.CharField("이름", max_length=20)
        age = models.PositiveIntegerField("나이")
        gender = models.CharField("성별", max_length=10)
        
    
    class Group(models.Model):
        name = models.CharField("이름", max_length=20)
        users = models.ManyToManyField(User, related_name='user_groups')

    users라는 속성에 유저를 ManyToManyField를 이용해 MantToMany 관계로 엮었습니다. related_name을 설정하면 유저에서 역참조로 그룹을 불러오는 것이 가능합니다. 이렇게 MantToMany 관계를 구현할 수 있습니다. DB를 확인해보면 users라는 중개 테이블이 자동으로 생성되고 user와 group이라는 칼럼을 갖고 있는 걸 확인할 수 있습니다. 하지만 이 방법은 users라는 테이블에 칼럼을 추가할 수 없습니다.

     

    다른 방법으로는 모델을 하나 더 만들어서 각 모델을 FK로 연결하는 방법이 있습니다.

    from django.db import models
    
    
    class User(models.Model):
        name = models.CharField("이름", max_length=20)
        age = models.PositiveIntegerField("나이")
        gender = models.CharField("성별", max_length=10)
        
    
    class Group(models.Model):
        name = models.CharField("이름", max_length=20)
    
    
    class Participant(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        joined_date = models.DateField("가입일", auto_now_add=True)

    Participant라는 모델을 만들어서 유저와 그룹을 FK로 연결했습니다. 이렇게 되면 유저와 그룹간의 다대다 관계에 칼럼을 추가할 수 있게 됩니다. 이 때 through를 이용하여 중개 모델을 명시적으로 지정해주는 것도 가능합니다.

    from django.db import models
    
    
    class User(models.Model):
        name = models.CharField("이름", max_length=20)
        age = models.PositiveIntegerField("나이")
        gender = models.CharField("성별", max_length=10)
        
    
    class Group(models.Model):
        name = models.CharField("이름", max_length=20)
        members = models.ManyToManyField(User, through='Participant')
    
    
    class Participant(models.Model):
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        joined_date = models.DateField("가입일", auto_now_add=True)

     

    '장고' 카테고리의 다른 글

    데일리 과제 6  (0) 2023.07.26
    데일리 과제 5  (0) 2023.07.25
    데일리 과제 4  (0) 2023.07.24
    데일리 과제 2  (0) 2023.07.20
    데일리 과제 1  (0) 2023.07.19
Designed by Tistory.