-final project 진행 중
-final project 백엔드: 비번 리셋, 메일 전송(스팸으로 분류 안 되고 정상 전송 완료),
프로필 편집(부분 동기식, 이미지 update S3연결, 비동기식으로 구현 중)
-매일 백준 알고리즘 문제 풀이
https://docs.djangoproject.com/en/4.0/ref/models/querysets/
https://django-orm-cookbook-ko.readthedocs.io/en/latest/index.html
https://docs.djangoproject.com/en/4.0/ref/django-admin/#makemigrations
https://velog.io/@suasue/Django-QuerySet-method1-CRUD-fa811za4
---앞서 정리한 부분이기도 하지만 문법과 함께 다시 정리하고자 한다.
- ORM(Object Relational Mapping)
객체지향 언어 ≠ 관계형 데이터베이스
객체지향 언어와 관계형 데이터베이스는 전혀 다른 목적과 다른 구성으로 되어 있기에, ORM은 이 둘을 연결해 주기 위해 객체 지향적인 방법을 사용하여 데이터베이스의 데이터를 쉽게 조작할 수 있게 해준다. 즉 ! Django ORM은 SQL을 파이썬 언어로 통역해 주는 역할을 하는 것.
<장점>
‣생상성 향상, 비즈니스 로직 집중
‣재사용 및 유지보수 용이
‣DBMS 종속되지 않음(오라클, SQLite, 마리아DB 등, 각 SQL문이 다르다)
<단점>
‣프로젝트가 복잡한 경우 난이도 상승
‣Raw Query 보다 성능이 낮음- Query
DB에 정보를 요청하는 것이다. 쿼리는 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청에 의한 처리이다.- QuerySet
전달 받은 모델 객체 목록. 쿼리셋은 DB로부터 데이터를 읽고, 필터를 걸거나 정렬할 수 있다.
QuerySet은 1개의 Query와 N개의 QuerySet으로 구성된다.
CRUD를 하다 보면 모델에 무슨 목록을 들고 왔는지 바로 바로 볼 수 없으니 답답한 경우가 많은데, 터미널에
python manage.py shell
입력하여 바로 확인 가능하다.
위의 명령어를 입력 후, 필요한 모듈을 import한다.from .models import User
1 ) Create 데이터 생성
- create()
DB에 새로운 객체를 생성하고 저장
생성된 인스턴스를 반환한다.
User.objects.create(name='강아지')
- bulk_create()
한 번에 여러 개의 객체를 생성하고 저장
생성된 인스턴스를 리스트에 담아 반환
User.objects.bulk_create([name='강아지', name='고양이'])
- get_or_create()
데이터베이스에 객체가 있으면 가져오고, 없으면 객체를 생성
(<object>, created: bool)
튜플 형태로 반환
object
- 가져오거나 생성된 객체가 담기고,created
- 객체의 생성 여부가 담기는데 해당 객체가 생성된 것이라면True
, 데이터베이스에서 가져온 것이라면False
User.objects.get_or_create(name='강아지', name_id='1')
- update_or_create()
데이터베이스에 객체가 있으면 수정하고, 없으면 객체를 생성
튜플과 bool 형태를 반환한다
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#update_or_create()2 ) Read 조회
- get()
해당 테이블에서 조건에 맞는 하나의 객체를 조회
조회된 인스턴스를 반환한다.
User.objects.get(id=1)
-><User: 강아지>
- all()
해당 테이블의 모든 레코드를 조회
해당 쿼리셋의 모든 요소를 복사본으로 반환한다
User.objects.all()
- values()
해당 테이블의 모든 레코드를 조회
iterable로 사용될 때 인스턴스가 아닌 딕셔너리를 포함하는 QuerySet을 반환
인자값으로 필드 이름을 넘겨 원하는 필드 정보만 딕셔너리로 구성할 수도 있다.
User.objects.values()
,User.objects.values("name")
- filter()
해당 테이블에서 조건에 맞는 레코드를 조회
QuerySet을 반환하며, QuerySet 안에는 각각의 인스턴스가 들어있다.
User.objects.filter(first_name="Koo")
3) Update 변경
- update()
이미 존재하는 객체에 대한 필드값을 수정
업데이트된 행(row) 수를 반환한다.
User.objects.filter(id=6).update(first_name='Gu')
4 ) Delete 삭제
조건에 맞는 모든 행 삭제
삭제된 객체 수와 객체 유형별 삭제 횟수가 있는 dictionary를 반환
get(), filter(), all()과 함께 사용 가능
Product.objects.filter(category_id=8).delete()
CRUD를 하면서 어렵게 느끼는 부분은 update이다. 아직 DB와 친하지 않아서 그런 것이겠지 생각하지만.. 웹사이트를 보면 update(수정) 기능은 필수이다.. 먼저는 django ORM 으로 DB와 친해져야겠다 : )
우주 최강 무한 삽질러로 기능 구현 중에 있으나.. 정말 조금씩 조금씩 기본 원리에 눈을 뜨고 있는 것 같다. 개미 같은 발전도 내게는 황금같으니.. 삽질을 하더라고 그 끝은 깨달음이길 바란다 ㄸㄹㄹㄹ
-Django shell에서 ORM 문법 많이 사용하면서 친해지기 ^^
-final project 맡은 백엔드 기능 구현 진행ing ...
-정신없이 흘러간 2주~3주 벌써 2022년 1분기가 끝나간다.. 아자!
ㅋㅋㅋ 작성 중이 점점 사라지길!