Django

GreenBean·2021년 4월 26일
post-thumbnail

Django

✔ Django 모델 API

Django 모델에서 모델 클래스를 정의하게 되면, Django는 데이타를 추가/갱신하고 읽어 들일 수 있는 다양한 데이타베이스 API들을 자동으로 제공한다. 이러한 기능은 Django가 ORM 서비스를 기본적으로 제공함에 따른 것으로 데이타베이스를 편리하게 핸들링할 수 있게 도와준다.

  • INSERT
    • 데이타를 삽입하기 위해서는 먼저 테이블에 해당하는 모델(Model Class)로부터 객체를 생성하고, 그 객체의 save() 메서드를 호출하면 된다. 아래 예제는 Product() 생성자 안에 필요한 필드 값들을 채운 후 save() 메서드를 호출하는 코드이다. save() 메서드가 호출되면, SQL의 INSERT이 생성되고 실행되어 테이블에 데이타가 추가된다.
from Product.models import *
 
# Product 객체 생성
a = Product(menu='drink', category='coffee')
 
# 새 객체 INSERT
a.save()
  • SELECT
    • Django는 디폴트로 모든 Django 모델 클래스에 대해 "objects" 라는 Manager (django.db.models.Manager) 객체를 자동으로 추가한다 (이 objects라는 이름을 변경할 수도 있지만, 대부분 그대로 사용한다). Django 에서 제공하는 이 Manager를 통해 특정 데이타를 필터링 할 수도 있고 정렬할 수도 있으며 기타 여러 기능들을 사용할 수 있다.
    • 데이타를 읽어오기 위해서는 Django 모델의 Manager 즉 "모델클래스.objects" 를 사용한다. 예를 들어, Feedback 이라는 모델의 경우 "Feedback.objects" 를 사용한다 (객체명이 아니라 클래스명을 사용함에 주의).
    • Django Model API에는 기본적으로 제공하는 여러 쿼리 메서드들이 있는데, 자주 사용되는 주요 메서드 몇 가지만 살펴보자.
      • all() : 테이블 데이타를 전부 가져오기 위해서는 Product.objects.all() 과 같이 all() 메서드를 사용한다.
      • get() : 하나의 Row만을 가져오기 위해서는 get() 메서드를 사용한다.
      • filter() : 특정 조건에 맞는 Row들을 가져오기 위해서는 filter() 메서드를 사용한다.
      • exclude() : 특정 조건을 제외한 나머지 Row들을 가져오기 위해서는 exclude() 메서드를 사용한다.
      • count() : 데이타의 갯수(row 수)를 세기 위해 count() 메서드를 사용한다.
      • order_by() : 데이타를 키에 따라 정렬하기 위해 order_by() 메서드를 사용한다. order_by() 안에는 정렬 키를 나열할 수 있는데, 앞에 -가 붙으면 내림차순이다.
      • distinct() : 중복된 값은 하나로만 표시하기 위해 distinct() 메서드를 사용한다. SQL의 SELECT DISTINCT 와 같은 효과를 낸다.
      • first() : 데이타들 중 처음에 있는 row만을 리턴한다.
      • last() : 데이타들 중 마지막에 있는 row만을 리턴한다.
    • 위의 쿼리 메서드들은 하나 하나가 실제 데이타 결과를 직접 리턴한다기 보다는 쿼리 표현식(Django에서 QuerySet이라 한다)을 리턴하는데, 여러 메서드들을 체인처럼 연결하여 사용할 수 있다. 즉, 여러 체인으로 연결되어 리턴된 쿼리가 해석되어 DB에 실제 하나의 쿼리를 보내게 된다.
  • UPDATE

데이타를 수정하기 위해서는 먼저 수정할 Row 객체를 얻은 후 변경할 필드들을 수정한다. 이어 마지막에 save() 메서드를 호출되면, SQL의 UPDATE이 실행되어 테이블에 데이타가 갱신된다.

  • DELETE

데이타를 삭제하기 위해서는 먼저 삭제할 Row 객체를 얻은 후 delete() 메서드를 호출하면 된다.

✔ URL 매핑

  • Django App URL 매핑 : 하나의 프로젝트 내에 여러 Django App이 존재한다면, 프로젝트 폴더 내의 메인 urls.py 파일 하나로 모든 URL 매핑을 하기 보다는 각각의 Django App 안에 urls.py 파일을 만들고 메인 urls.py 파일에서 각 Django App의 urls.py 파일로 URL 매핑을 위탁하게 할 수 있다. 이러한 URL 매핑 방식은 특히 다수의 App들을 포함하는 큰 프로젝트의 경우 편리한 방식이다.
  • URL 패턴 : Django 2.0 이전에는 URL 패턴을 지정하기 위해 정규표현식(RegEx)을 사용한 django.conf.urls.url() 함수를 사용하였는데, Django 2.0에서부터는 URL 패턴을 보다 간결하고 단순하게 표현한 django.urls.path()를 사용하게 되었다. Django 2.0 이상 버전에서는 일반적인 URL 패턴 지정을 위해 django.urls.path() 함수를 사용하되, path()에서 지정하지 못하는 복잡한 패턴의 경우 정규표현식을 사용하는 django.urls.re_path() 함수를 사용한다.
    • path() 함수 : Django 2.0에서부터 지원되는 django.urls.path() 함수path(route, view, kwargs=None, name=None) 와 같이 4개의 파라미터를 받아들일 수 있는데, 처음 2개의 파라미터는 반드시 있어야 하고, 뒤의 2개는 옵션이다. 첫번째 파라미터에는 URL route에서 사용된 경로를 지정하는 것이고, 두번째 파라미터는 해당 URL에 상응하는 View를 지정하는 것이다. 두번째 파라미터에서 View를 지정하는 방식으로는 함수 뷰(function view)의 이름을 지정하거나 클래스에 기반한 View (class based view)의 경우 "클래스명.as_view()"와 같이 지정한다. 세번째 파라미터에는 Dictionary 형식의 아큐먼트를 옵션으로 지정할 수 있으며, 마지막으로 네번째 파라미터에는 path 이름을 지정하는 것으로 이는 path명으로부터 URL 패턴 정보를 찾는 URL Reversing 을 위해 흔히 사용된다.
    • url() 함수 : Django 2.0 이전까지는 URL 라우팅을 위해 정규표현식(RegEx)을 사용하는 django.conf.urls.url() 함수를 사용하였다. url() 함수의 첫번째 파라미터는 매핑 URL 패턴을 가리킨다. 이 패턴은 Regular Expression (RegEx)을 사용하며, r'정규표현식'과 같이 앞에 r (raw) Prefix를 붙인다. RegEx는 매우 다양한 기능을 가지고 있으므로, 여기서는 자주 사용되는 표현 몇 가지만 살펴 본다. Django 2.0 부터는 url() 함수 대신 동일한 기능을 하는 re_path() 함수를 사용한다.
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글