✅ Django symmetrical 옵션 완전 이해하기

2025. 5. 16. 13:59·기술블로그-Django편

✅ 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
'기술블로그-Django편' 카테고리의 다른 글
  • ✅ Django ORM 필드 룩업 완전 정복: nickname__icontains vs tags__tag 차이 이해하기
  • ✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기
  • ✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기
  • 📌 Django ORM - get_or_create 완전 정복
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chinanightlife
    travel ban
    smartphonedurability
    gpterror
    classaction
    btsreunion
    titaniumcase
    life reflection
    self-growth
    btsdischarge
    newpoliticalparty
    youngprofessionals
    urbantrends
    basalcellcarcinoma
    bts
    trumpmuskclash
    americanlaw
    homebartrend
    global politics
    btscomeback
    americaparty
    remittance
    lawsuitculture
    college reunions
    RM
    livebroadcast
    hotcoffeecase
    뷔
    btsjungkook
    chatgpterror
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
✅ Django symmetrical 옵션 완전 이해하기
상단으로

티스토리툴바