- Published on
Django 샌드위치 구조개념과 Shell 사용하기
- Authors
- Name
- hongreat
- ✉️hongreat95@gmail.com
샌드위치 구조로 템플릿을 만드는 이유
"샌드위치 구조"는 Django 템플릿 디렉토리 구조에서 같은 이름의 템플릿 파일이 여러 앱에 존재할 때, 특정한 방식으로 템플릿 파일을 구성하는 패턴을 의미합니다.
Django에서 템플릿 파일을 찾을 때 INSTALLED_APPS
에 등록된 앱 순서대로 탐색하게 되는데, 이때 파일명이 같은 템플릿이 여러 앱에 있을 경우 먼저 찾은 파일을 사용하게 됩니다. 이로 인해 의도하지 않은 템플릿 파일이 렌더링될 수 있습니다.
이를 방지하기 위해 각 앱의 템플릿 파일을 "샌드위치 구조"로 구성합니다.
- APP_DIRS의 TRUE 설정 : 각 앱의 템플릿에서 템플릿 파일을 찾으라는 의미입니다.
- 이렇게 설정하면, 동일한 이름의 HTML 파일이나 템플릿 안에 파일을 찾을 때 문제가 발생할 수 있습니다.
INSTALLED_APPS
설정에서 위에서 아래로 순차적으로 템플릿을 검색하게 됩니다.- 최상위 공통 템플릿 디렉토리:
templates
폴더가 프로젝트의 공통 템플릿을 저장하는 곳으로 사용됩니다. - 앱별 템플릿 디렉토리: 각 앱은 자신만의 템플릿 디렉토리를 가지며, 템플릿 파일을 고유하게 관리합니다. 예를 들어,
app1/templates/app1/
처럼 디렉토리를 앱 이름과 함께 사용합니다.
Python 코드 → Model(ORM) → 데이터베이스
- Django 공식 문서에 마이그레이션(migration)에 대한 설명과 참고 사항이 적혀 있습니다. 매우 유용하니 참고하시기 바랍니다.
마이그레이션 | Django documentation | Django
- ORM (Object-Relational Mapper)
- 원래는 데이터베이스에 접근할 때 SQL을 사용하지만, Django에서는 이를 Python 코드로 처리할 수 있게 해줍니다.
python manage.py makemigrations
python manage.py migrate
마이그레이션은 Django의 데이터베이스에 변경사항을 기록하는 목록입니다. 각 앱의 migrations
디렉토리에 생성되며, 데이터의 ID 값을 자동으로 저장해 다른 데이터와 충돌되지 않도록 해주는 기능도 있습니다.
- 현재 생성되어 있는 마이그레이션 목록을 확인하려면 다음 명령어를 사용합니다.
- 이때 [x]로 표시된 항목들은 이미 반영된 것입니다.
python manage.py showmigrations
- ORM을 통해 어떻게 SQL로 변환되었는지 확인하려면 다음 명령어를 사용합니다.
python manage.py sqlmigrate 앱이름 0001 (원하는 번호)
Shell을 통해 데이터 접근하기
- Shell을 사용하여 데이터를 추가할 수 있습니다!
장고 ORM 요리책 - Django ORM Cookbook 2.0 documentation
모델과 터미널
- 먼저 Shell에 접속합니다.
python3 manage.py shell
- 모델 API 기본
- 모델 API 사용 시 자주 헷갈릴 수 있는 's' 등의 접미어를 정리합니다.
- 모든 데이터를 조회할 때:
Menu.objects.all() # models.py에 정의된 클래스명
- 새로운 데이터를 생성할 때:
Menu.objects.create(값을 입력)
- 세부 데이터를 조회할 때:
Menu.objects.all().values()
QuerySet API
Django 모델에서 데이터를 가져올 때 사용하는 목록은 파이썬의 리스트와 유사한 형태를 띠는 QuerySet입니다.
QuerySet 반환
all()
: 해당 모델 테이블의 모든 데이터를 조회합니다.
{모델클래스명}.objects.all()
- `filter()` : 특정 조건에 맞는 모든 데이터를 조회합니다.
{모델클래스명}.objects.filter(content_contains='포함할 값')
- `exclude()` : 특정 조건을 제외한 데이터를 조회합니다.
{모델클래스명}.objects.exclude(title_contains='제외할 값')
- `order_by()` : 특정 조건으로 데이터를 정렬하여 조회합니다.
{모델클래스명}.objects.order_by('정렬 기준')
- `values()` : QuerySet에 있는 모델 데이터를 사전형 리스트로 반환합니다.
{모델클래스명}.objects.all().values()
데이터 하나씩 반환
get()
: 조건에 맞는 하나의 데이터를 조회합니다.create()
: 하나의 데이터를 생성하고 모델을 반환합니다.get_or_create()
: 조건에 맞는 데이터를 조회하고, 없으면 새로 생성하여 반환합니다.latest()
: 주어진 필드 기준으로 가장 최신의 데이터를 반환합니다.first()
: 가장 첫 번째 데이터를 반환하며, 없으면None
을 반환합니다.last()
: 연산된 QuerySet의 마지막 데이터를 반환하며, 없으면None
을 반환합니다.
필드 조건에 대한 공식 문서
- 필드 조건 옵션은 외우기보다는 필요할 때마다 참고하는 것이 좋을 것 같습니다.