멘토링 Django ORM심화 (8회차 정리 250527)

2025. 5. 27. 23:03·멘토링

📌 장고 ORM에서 역참조란 무엇인가?

역참조는 ForeignKey를 가지고 있지 않은 모델에서 ForeignKey를 가진 모델을 참조하는 것을 의미하며, _set 또는 related_name을 사용하여 접근할 수 있습니다.


💡 역참조 시 related_name을 사용하는 이유는?

_set 대신 더 의미 있는 이름으로 변경하여 가독성을 높이기 위해 사용합니다.


🎥 이 멘토링 세션에서는 Django ORM을 활용한 모델 생성, 정참조/역참조, 필터링, 최적화 기법까지 전반적인 흐름을 실습 중심으로 다룹니다.


  1. 🤖 DRF와 백엔드 지식의 한계
  • DRF는 깊이 있는 전달은 어렵지만, 실습 수준에서는 지원 가능함.
  • 대신 Django 기반의 백엔드 지식은 대부분 설명할 수 있으며, 가능한 한 도움을 줄 예정임.
  1. 📚 가상 환경과 앱 개발의 이해
  • 프로젝트마다 Python 버전과 라이브러리가 달라질 수 있으므로, 가상환경 사용이 필수적임.
  • conda, poetry, PyCharm 등 자신에게 익숙한 도구 중 하나를 잘 사용하는 것이 중요함.
  • 앱 생성 후 가장 먼저 해야 할 일은 settings.py에 앱을 등록하는 것임.
  1. 🍵 카테고리/서브카테고리 모델 설정 및 on_delete 옵션
  • on_delete=models.CASCADE: 부모 객체가 삭제되면 자식 객체도 자동으로 삭제됨.
  • on_delete=models.SET_NULL: 부모 객체가 삭제될 경우 자식 객체의 ForeignKey 값을 null로 설정함.
  • models.ForeignKey를 사용해 관계 설정 후 마이그레이션 진행함.
  1. ☕ 정참조 vs 역참조 개념
    4.1. 정참조
  • Coffee → SubCategory: ForeignKey 필드를 통해 직접 참조함.
  • .sub_category.name처럼 점 접근 방식으로 사용할 수 있음.

4.2. 역참조

  • SubCategory → Coffee: 어떤 Coffee 인스턴스들이 자신을 참조하고 있는지 알 수 없음.
  • 기본 접근 방식: sub_category.coffee_set.all()
  • related_name='coffees' 설정 시 → sub_category.coffees.all() 사용 가능

4.3. related_name의 장점

  • _set 대신 더 직관적인 이름으로 지정 가능함.
  • 여러 모델에서 같은 이름이 중복되는 것을 방지할 수 있음.

4.4. 관계 필터링 (__)

  • 예: 카테고리 ID가 1인 커피 검색
Coffee.objects.filter(sub_category__category__id=1)
  • __(더블 언더스코어)를 이용해 관계를 타고 들어가며 필터링할 수 있음.
  1. 🔍 필터링, 슬라이싱, 컨테인, 정렬
    5.1. 가격 필터링
Coffee.objects.filter(price__gt=5000)   # 5000보다 큰 가격
Coffee.objects.filter(price__lte=3000)  # 3000 이하 가격

5.2. 문자열 포함 검색

Coffee.objects.filter(description__icontains="계란")  # 대소문자 무시
Coffee.objects.filter(description__contains="계란")    # 대소문자 구분

5.3. 슬라이싱 (오프셋/리미트)

Coffee.objects.all()[1:3]  # 인덱스 1부터 2까지 (3은 미포함)

5.4. 정렬

Coffee.objects.order_by("price")      # 낮은 가격부터 정렬
Coffee.objects.order_by("-price")     # 높은 가격부터 정렬
  1. 📊 ORM 최적화 기법
    6.1. select_related (정참조 최적화)
Coffee.objects.select_related("sub_category").all()
  • 정참조 관계인 ForeignKey를 한 번의 쿼리로 미리 불러올 수 있음

6.2. prefetch_related (역참조 최적화)

SubCategory.objects.prefetch_related("coffees").all()
  • 역참조 또는 ManyToMany 관계는 별도 쿼리로 가져와 메모리에서 조합함

6.3. 반복 쿼리 줄이기

  • .all() 이후 .name처럼 접근 시, 매번 DB 쿼리가 발생할 수 있음
  • select_related 또는 prefetch_related를 통해 성능을 최적화할 수 있음
  1. 🛠️ 타입 힌트 및 테스트 코드 활용
  • Python은 타입 선언이 강제되지 않지만, 타입 힌트는 가독성과 유지보수에 도움을 줌
def get_price(item: Coffee) -> int:
    return item.price
  • TypeScript나 Java는 타입 지정이 필수이며, 테스트 코드 작성이 일반적임
  • Python에서도 습관적으로 타입을 명시하는 것이 좋은 코드 작성에 도움이 됨

✅ 마무리 요약

  • 역참조는 ForeignKey의 반대 방향 참조이며 _set 또는 related_name으로 접근
  • __ 연산자와 필드명을 활용해 관계 필터링 가능
  • select_related / prefetch_related를 통해 성능을 개선할 수 있음
  • 타입 힌트를 적극 활용하면 코드 품질과 협업 효율성이 향상됨

'멘토링' 카테고리의 다른 글

멘토링 Django 심화 (7회차 정리)  (0) 2025.05.16
멘토링 내용 정리 Django 실무 중심 웹 개발 로드맵 (6회차 정리)  (0) 2025.05.08
📌 실무 멘토링에서 얻은 Django + 배포 환경 인사이트 요약(250508)  (0) 2025.05.08
멘토링 질문(250508)  (0) 2025.05.08
멘토링 내용 정리 Flask & API (5회차 정리)  (0) 2025.04.25
'멘토링' 카테고리의 다른 글
  • 멘토링 Django 심화 (7회차 정리)
  • 멘토링 내용 정리 Django 실무 중심 웹 개발 로드맵 (6회차 정리)
  • 📌 실무 멘토링에서 얻은 Django + 배포 환경 인사이트 요약(250508)
  • 멘토링 질문(250508)
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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
멘토링 Django ORM심화 (8회차 정리 250527)
상단으로

티스토리툴바