✅ Django symmetrical 옵션 완전 이해하기
1. 🔍 symmetrical이란?
Django의 ManyToManyField에서 '자기 자신(self)' 모델과의 관계를 정의할 때,
"한쪽만 연결할지, 양쪽을 동시에 연결할지"를 결정하는 옵션입니다.
2. 🔁 설정별 관계 구조
✅ symmetrical=True (기본값)
- 양방향 관계
- 내가 너를 연결하면 → 너도 나랑 자동으로 연결됨
- 예: 친구, 커플, 공동작업자
✅ symmetrical=False
- 단방향 관계
- 내가 너를 팔로우해도 → 너는 날 팔로우하지 않음
- 예: 팔로우, 구독, 좋아요
3. 🔨 코드 예시 비교
🔷 symmetrical=True (친구 관계 예시)
class User(models.Model):
friends = models.ManyToManyField('self', symmetrical=True)
me.friends.add(you)
➡ you.friends.all()에도 자동으로 me가 들어감 ✅
🔶 symmetrical=False (팔로우 관계 예시)
class User(models.Model):
following = models.ManyToManyField('self', symmetrical=False)
me.following.add(you)
➡ you.following.all()에는 me가 들어가지 않음 ❌
✔️ 관계는 한쪽 방향으로만 생성됨
4. 📌 왜 symmetrical=False가 필요할까?
✅ 1) 현실적인 관계 반영
- 소셜 미디어에서는 대부분 단방향 관계 (팔로우)
- 친구처럼 자동으로 묶이는 게 아님
✅ 2) 데이터 오류 방지
- symmetrical=True면 내가 추가했는데 상대방도 나와 연결됨 → 잘못된 연결 가능성
✅ 3) UX 흐름에 따라 달라짐
- 인스타그램: 내가 팔로우하면 끝 (단방향)
- 페이스북: 친구 수락이 있어야 성립 (양방향)
✅ 4) 쿼리 구분이 쉬움
user.following.all() # 내가 팔로우한 사람들
user.followers.all() # 나를 팔로우한 사람들 (related_name)
5. 🎯 한 줄 요약
설정 설명 예시
symmetrical=True | 양방향 관계 자동 연결 | 친구, 커플 |
symmetrical=False | 단방향 관계만 생성 | 팔로우, 구독 |
6. 🤔 아직 헷갈리신다면?
me.following.add(you) 했을 때...
- you가 자동으로 me를 following에 추가된다면 이상하지 않나요?
- 그래서 명확하게 단방향 관계를 설정하려면 symmetrical=False를 꼭 지정해야 합니다.
✅ Django symmetrical 실습 예제 – 친구 vs 팔로우 관계
1. 🔨 모델 정의 예시
# models.py
from django.db import models
class SymFriend(models.Model):
name = models.CharField(max_length=20)
friends = models.ManyToManyField('self', symmetrical=True) # 친구관계 (양방향)
class AsymFollow(models.Model):
name = models.CharField(max_length=20)
following = models.ManyToManyField('self', symmetrical=False) # 팔로우관계 (단방향)
# 마이그레이션 적용
python manage.py makemigrations
python manage.py migrate
2. 🧪 Django Shell 실습
python manage.py shell
✅ 친구 관계 테스트 (symmetrical=True)
from app.models import SymFriend
a = SymFriend.objects.create(name='Alice')
b = SymFriend.objects.create(name='Bob')
a.friends.add(b)
# 결과 확인
a.friends.all() # ✅ Bob 포함
b.friends.all() # ✅ Alice 자동 포함 (양방향 연결)
✅ 팔로우 관계 테스트 (symmetrical=False)
from app.models import AsymFollow
x = AsymFollow.objects.create(name='X')
y = AsymFollow.objects.create(name='Y')
x.following.add(y)
# 결과 확인
x.following.all() # ✅ Y 포함
y.following.all() # ❌ X 없음 (단방향 연결)
3. 📊 결과 비교 요약
설정 추가한 쪽 반대쪽에 자동 추가됨?
symmetrical=True | a.friends.add(b) | ✅ b도 a와 친구로 자동 연결 |
symmetrical=False | x.following.add(y) | ❌ y는 x를 팔로우하지 않음 |
✅ 마무리 팁
- symmetrical=True: 친구처럼 쌍방 관계가 필요한 경우
- symmetrical=False: 팔로우처럼 단방향 관계가 필요한 경우
현실에서 어떤 관계를 구현하고 싶은지 먼저 생각한 뒤, 방향성을 잘 설정하세요! 😊
'기술블로그-Django편' 카테고리의 다른 글
✅ Django ORM 필드 룩업 완전 정복: nickname__icontains vs tags__tag 차이 이해하기 (0) | 2025.05.16 |
---|---|
✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기 (0) | 2025.05.16 |
✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기 (0) | 2025.05.16 |
📌 Django ORM - get_or_create 완전 정복 (0) | 2025.05.16 |
📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명 (0) | 2025.05.16 |