Django 11. ManyToManyField 2

jiffydev·2020년 10월 19일
0

"self"

데이터베이스에서 테이블이 자기자신을 참조한다고 한다면 이상할까?
자신을 참조해서 뭐하나 싶지만 필요할 때가 분명 있다. 인스타그램의 팔로우를 생각해보자. 한 유저가 다른 유저를 팔로우하는 데이터를 보관해야 할 때, 유저 테이블을 참조하는 Follow 테이블을 새로 만들 수도 있겠지만 이번에는 유저 테이블이 자신을 참조하는 follow 필드로 팔로우를 구현했다.

# models.py
class User(models.Model): 
    email    = models.EmailField()
    phone    = models.CharField(max_length=20)
    name     = models.CharField(max_length=20)
    password = models.CharField(max_length=1000)
    follow   = models.ManyToManyField("self", symmetrical=False)
    
    class Meta: 
        db_table = 'users'

이렇게 하면 새로운 테이블을 생성할 필요 없이, 필드만 추가해 주면 자동으로 중간 테이블이 생성되어 그 안에 from_user_id, to_user_id 가 나타난다.


from, to.. 팔로우라고 생각하면 굉장히 직관적인 필드명이지 않은가.

symmetrical

위와 같이 자신을 참조하는 M2M필드를 생성하면 중간 테이블은 기본적으로 symmetrical=True로 설정되어 있다.
symmetrical, 대칭된다는 뜻이다. 예를 들어 인스타그램에서 A가 B를 팔로우하면 자동으로 B도 A를 팔로우하게 된다는 말이다. 그런 관계가 필요한 경우라면 그냥 True로 냅둬도 되겠지만, 위와 같은 인스타그램에서는 그런 상황이 발생하면 안 될 것이다.
그렇기 때문에 M2M필드를 생성할 때 symmetrical=False를 인자로 주어서 한 쪽이 팔로우를 하더라도 상호 팔로우가 되지 않도록 해야 한다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글