[Django] 장고 스터디 2일차

jun·2021년 12월 23일
0

장고스터디

목록 보기
2/4

static & media file

1. Static 파일

  • 개발 리소스 (JS, CSS, Image 등)
  • 앱 / 프로젝트 단위로 저장 / 서빙

2. Media 파일

  • FileField / ImageField를 통해 저장한 모든 파일
  • DB필드에는 저장경로를 저장하며 파일은 파일 스토리지에 저장
  • 프로젝트 단위로 저장

Media 파일 처리 순서

  1. HttpRequest.FILES를 통해 파일이 전달
  2. 뷰 로직이나 폼 로직을 통해, 유효성 검증을 수행
  3. FileField / ImageField 필드에 경로를 저장
  4. settings.MEDIA_ROOT 경로에 파일을 저장

FileField와 ImageField

FileField

  • File Storage API를 통해 파일을 저장

ImageField (FileField 상속)

  • Pillow (이미지 처리 라이브러리)를 통해 이미지 width/height 획득
  • upload_to 옵션: settings.MEDIA_ROOT 하위에서 저장한 파일명 / 경로명 결정 (default: 파일명 그대로 settings.MEDIA_ROOT에 저장)

Model Manager

데이터베이스 Query 인터페이스를 제공
Default Manager로서 ModelCls.objects 가 제공

# SELECT * FROM app_model;
ModelCls.objects.all()

# SELECT * FROM app_model ORDER BY id DESC LIMIT 10;
ModelCls.objects.all().order_by('-id')[:10]

# INSERT INTO app_model (title) VALUES ("New Title");
ModelCls.obejcts.create(title="New Title")

RDBMS에서의 관계

  • 1:N 관계 -> models.ForeignKey 표현
  • 1:1 관계 -> models.OneToOneField 표현
  • M:N 관계 -> models.ManyToManyField 표현

Migrations


모델의 변경내역을 "데이터베이스 스키마"로 반영시키는 효율적인 방법을 제공하는 명령어

  • 마이그레이션 파일 생성
    > python manage.py makemigrations <appname>
  • 지정 데이터베이스에 마이그레이션 적용
    > python manage.py migrate <appname>
  • 마이그레이션 적용 현황 출력
    > python manage.py showmigrations <appname>
  • 지정 마이그레이션의 SQL 내역 출력
    > python manage.py sqlmigrate <appname> <migration-name>

장고에서는 테이블의 기본키로서 id (AutoField) 필드를 default로 생성한다. 다른 필드를 기본키로 지정하고싶다면 primary_key=True 옵션 적용.


View

  • 1개의 HTTP 요청에 대해 1개의 뷰가 호출
  • urls.py/urlpatterns 리스트에 매핑된 호출 가능한 객체
  • 웹 클라이언트로부터의 HTTP 요청을 처리
  • 장고에서는 크게 2가지 형태의 뷰를 지원
    1. 함수 기반 뷰 (FBV): 장고 뷰의 기본
    1. 클래스 기반 뷰 (CBV): 클래스.as_view()를 통해 호출가능한 객체를 생성/리턴

View 호출 시 인자값

  1. HttpRequest 객체: 현재 요청에 대한 모든 내역을 담고 있음.
  2. 현재 요청의 URL로부터 Capture된 문자열들

View 호출 시 리턴값

  1. HttpResponse 객체를 반드시 리턴해야함.
  2. 파일like객체 혹은 str/bytes 타입의 응답 지원
  3. 파일 like 객체

Class 기반 뷰를 만들었을 때 장점

  • 멤버 함수를 쪼개서 객체의 기능을 추가할 수 있다.
  • 상속과 overloading을 사용할 수 있다.
profile
hi

0개의 댓글