자유게시판

자유게시판

아무말대잔치

Django의 ManyToManyField 정리

hoon | 2024-03-16 12:32

Django ManyToManyField 정리

공부하다 ManyToManyField의 파라미터 중 through를 발견했습니다.
django 공식문서를 참조하여 겨우 이해했는데 그 내용을 까먹기전에 정리하고자 합니다.

일단 앞서, Django에서 ER 모델로 models.py를 구성하는 작업은 굉장히 중요하다고 생각합니다.
장고는 ORM을 사용하여 DB를 연결하여 SQL문을 사용하지않더라도 쉽게 접근이 가능하기 때문입니다.
그리고 makemigration을 통해 직접 DB테이블을 생성하기때문에 DB작업자가 아니어도 명령어 하나로 쉽게 DB가 생성되고 변경될 수 있기 때문입니다.


자, 이제 본론으로 넘어가서
ManyToManyField란 ER모델에서, 두 종류 혹은 여러 종류의 클래스들이 서로 M:N관계에 있는걸 뜻합니다.

django doc에 있는 코드를 가져왔습니다.

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=50)


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(
        Person,
        through="Membership",
        through_fields=("group", "person"),
    )


class Membership(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    inviter = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
        related_name="membership_invites",
    )
    invite_reason = models.CharField(max_length=64)

Person, Group, Membership이 구성되어있는데,
Person과 Group은 models.ManyToManyField를 통해 M:N의 관계에 있는걸 알 수 있습니다. (사람도 N명, 그룹도 N개)

이 때, ManyToManyField의 파라미터중 through가 있습니다.
django는 기본적으로 ManyToManyField를 사용하게되면, 자동적으로 중간테이블을 생성합니다. (Person과 Group의 중간테이블)
그럼 through는 무슨일을 할까요??
바로 그 중간테이블을 직접 지정하는 역할을 합니다.

해당 코드에선 Membership을 참고하고있으니 Membership 클래스를 살펴보면, group, person 외의 다른 필드도 지정 할 수 있습니다.

저는 해당 thorugh를 사용하지않고, 개발을 진행해서 사용이유를 몰랐으나 찾아보니 가급적 사용하는게 좋아보입니다.
이유는 당장은 필요없을지 몰라도, 모델 구성은 어떻게 변할지 장담할수없습니다. 때문에 미리 매개 테이블을 생성해두는게 좋습니다.
필요할 때 생성하면 되겠지 생각했지만, 매핑된 테이블을 장고의 모델로 등록하기위해선 migration을 진행해야하는 불편함이 있습니다.

따라서 ManyToManyField를 사용하고자 할 때는, 가 급 적 through 옵션을 사용하여 중간 매개 테이블을 정의해주는게 좋을 것 같습니다!!

Search
Categories