본문 바로가기
PROGRAMMING/Django

[Django] Django ORM, CRUD

by 안녕나는현서 2021. 9. 3.
728x90

ORM

  • Object - Relational - Mapping
  • DB를 객체(object)로 조작하기 위해 사용
  • 객체 지향 프로그래밍 언어를 사용하여 호환되지 않는 유형의 시스템 간에 (Django -SQL) 데이터를 변환하는 프로그래밍 기술
  • OOP 프로그래밍에서 RDBMS를 연동할 때, 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
  • Django는 내장 Django ORM을 사용
  • 장점
    • SQL을 잘 몰라도 DB 조작 가능
    • SQL의 절차적 접근이 아닌 객체 지향적 접근으로 인한 높은 생산성
  • 단점
    • ORM만으로 완전한 서비스를 구현하기 어려움

 

DB API

  • DB를 조작하기 위한 도구
  • django가 기본적으로 ORM을 제공함에 따른 것으로 DB를 편하게 조작할 수 있도록 도움
  • https://docs.djangoproject.com/en/3.2/topics/db/queries/
  • DB API 구문 : class이름.Manager.QuerysetAPI
    • 예시 ) Article.objects.all()
    • Manager
      • django 모델 데이터베이스 query 작업이 제공되는 인터페이스
      • 기본적으로 모든 django 모델 클래스에 objects라는 Menager를 추가
    • QuerySet
      • 데이터베이스로부터 전달받은 객체 목록
      • queryset 안의 객체는 0개, 1개 혹은 여러 개일 수 있음
      • 데이터베이스로부터 조회, 필터, 정렬 등을 수행할 수 있음
  • Django shell
    • 일반 python shell을 통해서는 장고 프로젝트 환경에 접근할 수 없음
    • 그래서 장고 프로젝트 설정이 load된 Python shell을 활용해 DB API 구문 테스트 진행
    • 기본 Django shell보다 더 많은 기능을 제공하는 shell_plus를 사용해서 진행
      • Django-extensions 라이브러리 기능 중 하나
      • 반드시 setting.py에 등록 후 실행!! : 'django_extensions'
        $ pip install ipython            # model에 데이터를 입력하기 위함
        $ pip install django-extensions
        $ python manage.py shell_plus

CRUD

  • 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능은 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말
  • https://ko.wikipedia.org/wiki/CRUD

 

[Create]

- 첫 번째 방법 : 인스턴스 생성 후 인스턴스 변수 설정

article = Article_model()            # Article_model 모델의 인스턴스 생성
article.title = 'first'              # 인스턴스 변수에 값 전달
article.content = 'first content'    # 인스턴스 변수에 값 전달
article.save()                       # 저장

  • save() method
    • 객체를 데이터베이스에 저장
    • 데이터 생성시 save()를 호출하기 전에는 객체의 ID 값이 무엇인지 알 수 없음
      • ID값은 django가 아니라 DB에서 계산되기 때문
    • 단순히 모델을 인스턴스화 하는 것은 DB에 영향을 미치지 않기 떄문에 반드시 save()가 필요

 

- 두 번째 방법 : 인스턴스 생성 시 키워드 인자를 통해 바로 전달

article = Article_model(title='second', content='second content') # Article 모델의 인스턴스 생성
article.save()
  • 저장 전에 유효성 검사를 진행할 수 있으며, 첫 번째 방법보다 간단하기 때문에 주로 사용!

 

- 세 번째 방법 : create() 사용

article = Article_model.objects.create(title='third', content='third content')
  • save() 호출이 필요없음
  • 생성된 데이터를 반환 (그렇기 때문에 바로 저장 가능)

 

[Read]

  • 크게 2가지로 분류
    1. Method that return new querysets
    2. Method that do not return querysets

 

- all()

  • 해당 모델의 모든 데이터를 조회
  • queryset 리턴
    • queryset : 유사 리스트, 데이터가 없으면 빈 리스트를 반환
Article_model.objects.all()

 

- get()

  • 해당 모델의 특정 데이터 하나를 조회
  • 주어진 lookup 매개변수와 일치하는 객체를 반환
  • 해당 데이터가 없을 경우 에러 반환 (DoesNotExist)
  • 둘 이상의 데이터가 찾아지면 에러 반환 (MulitipleObjectReturned)
  • 위와 같은 특성 때문에 primary key와 같이 고유성을 보장하는 조회에서 사용
Article_model.objects.get(pk=1) # pk 혹은 id가 1인 데이터 리턴

 

- filter()

  • 조건에 맞는 데이터(들) 조회
  • queryset 리턴
  • 조회 결과가 없어도 에러를 띄우지 않음
Article_model.objects.filter(title='first')

 

[Update]

  1. 수정할 데이터를 먼저 불러온다. (read)
    • 조회한 데이터가 정확히 가져와졌는지 확인!
  2. 수정할 부분을 수정한다.
  3. 데이터베이스에 반영한다. (save)
article = Article_model.objects.get(pk=1)
article.title = 'updated title'
article.save()

 

[Delete]

- delete()

  • QuerySet의 모든 행에 대해 삭제를 수행하고, 삭제된 객체 수와 객체 유형당 삭제 수가 포함된 딕셔너리 반환
  1. 삭제할 데이터를 불러온다.
  2. 불러온 데이터가 정확한 지 확인한다.
  3. 삭제한다.
article = Article_model.objects.get(pk=2)
article.delete()

 

[Field lookups]

  • 조회 시 특정 검색 조건을 지정
  • filter(), exclude(), get()에 대한 키워드 인수로 지정됨
  • 예시 : Article_model.objects.filter(pk__gt=2)

 

[최종 CRUD 구현]

https://github.com/hyunse0/SSAFY_Project/tree/master/pjt04

728x90

'PROGRAMMING > Django' 카테고리의 다른 글

[Django] Admin Page  (0) 2021.09.06
[Django] Model, DB, Migration  (0) 2021.09.03
[Django] URL, namespace  (0) 2021.09.02
[Django] HTML Form  (0) 2021.09.02
[Django] DTL(Django Template Language), Template 상속  (0) 2021.09.02

댓글