Django는 파이썬 쉘을 이용해 데이터를 관리할 수 있는 API를 제공한다. ORM을 통해서 데이터에 대한 CRUD를 실습해보자
CRUD는 아래 네가지를 일컫는 말이다.
- Create
- Read
- Update
- Delete
Django 쉘을 사용하기 위해서는 아래 명령어를 입력해 준다.
python3 manage.py shell
Create : 데이터 생성 / 입력
테이블에 레코드를 생성하는 것이다. 레코드를 생성하기 위해서는 필드값을 지정해 객체를 생성한다. 레코드를 생성해준 뒤에는 꼭 save()메소드를 호출해 주어야 한다. 이 이유는 save()명령을 실행하기 전에는 메모리에서만 변경이 되기 때문이다. 이는 SQL용어의 INSERT랑 동일하다.
Read : 데이터 조회
데이터베이스로 부터 데이터를 조회하기 위해 QuerySet객체를 사용한다. QuerySet은 데이터베이스 테이블로부터 꺼내온 객체들의 콜렉션이다.QuerySet은 필터를 가질 수 있으며, QuerySet내의 항목중 맞는 조건만 레코드에서 다시 추출한다. SQL용어로 QuerySet은 SELECT문에 해당하며 필터는 WHERE에 해당한다. QuerySet을 얻기 위해서는 objects객체를 사용한다. 이는 테이블 정보를 담고있는 객체이다. 그리고 이 objects객체의 모든 레코드를 보고싶은 경우 objects.all()을 사용해 주어야한다.
일부 조건에 맞는거만 찾기 위해서 filter(), exclude()메소드를 사용해준다.
- filter : 주어진 조건에 맞는 객체들을 담고있는 QuerySet콜렉션 반환
- exclude : 주어진 조건에 맞는 객체들을 제외한 QuerySet콜렉션 반환
question_text는 필드이고 뒤에 __(언더스코어 2개)로 붙은 추가 적인 속성이 있다. 이는 Django QuerySet의 Fieldlookups라는 것이다. Document는 아래를 참고하자
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#field-lookups
Fieldlookup에 대한 간단한 설명으로는
필드 룩업은 SQL WHERE 절의 피트(조건)를 지정하는 방법입니다.
라고 적혀있다. __startswith뿐만 아니라 필드 타입에 맞춰제공되는 여러가지 fieldlookup이 존재한다.(Document 읽기를 습관화하자)
만약 요소가 하나만 있는게 확실하면 get()메소드를 호출하면 된다. 호출 결과는 QuerySet이 아닌 하나의 객체이다.
또한 QuerySet객체는 요소 개수를 제한하기 위해서 파이썬 MutableSequence 슬라이싱 문법도 제공한다. 단 슬라이싱을 하면 QuerySet타입이 아닌 리스트를 반환한다. 이는 SQL용어로 OFFSET, LIMIT절에 해당한다.
Update : 데이터 수정
이미 존재하는 객체에 대해 필드를 수정하는 경우에도 필드 속성값을 수정한 후 save()메소드를 호출해야한다. 이는 UPDATE절에 해당한다.
한번에 여러개 객체의 값을 수정하기 위해서는 update()메소드를 사용한다. 아래는 생성일자가 2022년인 모든 객체에 대해 question_text값을 "Same Question Text"로 바꾸는 것이다.
Delete : 데이터 삭제
데이터를 삭제하기 위해서는 delete()메소드를 사용한다. 이는 SQL 용어로 DELETE절에 해당한다. delete()메소드는 실행 후에 save()를 해주지 않아도 된다. 방금 위에서 질문 제목을 모두 바꿨기 때문에, 새로운 질문을 생성하고 그 질문을 필터링 해 delete()하는 과정을 작성해 보자.
만약에 특정 레코드의 모든 값을 지워야 한다면 (모델).objects.all().delete()를 해주어야 한다.
'Back-End > Python Django' 카테고리의 다른 글
[Django] 템플릿 상속하기 (0) | 2022.02.22 |
---|---|
[Django][django template] 템플릿 시스템 (0) | 2022.02.18 |
[Django] [admin page] 장고 어드민 페이지 title 변경하기 (0) | 2022.02.18 |
[Django] [admin page]search_fields (0) | 2022.02.18 |
[Django][admin page] list_filter필터 (0) | 2022.02.18 |