@ ORM (Object-Relational-Mapping)
=> "DB의 테이블을 객체처럼 Class 로 사용하는 기술"
=> 더 효율적, 가독성 및 유지 보수에 적합한 코드 만들기
=> 객체와 관계형-데이터베이스(RD) 데이터를 매핑해줌
=> 객체간의 관계로 SQL을 자동 생성
=> SQL 쿼리문 없이도 DB의 데이터를 다룰 수 있게 함
SQL문 자동생성
객체 지향 => CLASS
관계형 DB => TABLE
#쿼리셋
전달받은 모델의 객체 목록
DB 에서 DATA 를 읽고 필터를 걸거나 정렬 가능
# 역참조
부모_모델.자식_모델_set
#조회 - SELECT
from blog.models import 모델명
# 모든 객체 조회(쿼리셋으로 반환)
모델명.objects.all()
# 하나만 조회(주로 pk, 객체 타입 반환)
모델명.objects.get(id=1)
# 특정 조건 row 들만 조회(쿼리셋으로 반환)
모델명.objects.filter(Group_id = 1)
# 특정 조건을 제외한 row 들만 조회(쿼리셋으로 반환)
모델명.objects.exclude(Group_id = 1)
# filter() , exclude() 의 내장 모듈
모델명.objects.filter(code__contains='lucky')
=> __contains / __icontains
=> __startswith / __endswith
=> __gt / __li / __in
=> 특정 문자 포함(대소문자 구분 / 구분 없이)
=> 특정 문자로 조회(시작 / 끝)
=> 특정 값 조회(큰 / 작은 / 리스트 안에 하나라도 포함)
# filter 를 AND / OR 가능
모델명.objects.filter(id__gt=3)
& 모델명.objects.filter(name__startswith="고기")
#생성 - INSERT
from blog.models import 모델명
# 데이터 생성
모델명.objects.create(code='food_cow', name='음식_소')
# 빈 모델에 선언 후 데이터 생성
모델 = 모델명()
모델.code = "food_cow"
모델.name = "음식_소"
모델.save()
#갱신 - UPDATE
from blog.models import 모델명
# 필드 변경 저장
모델 = 모델명.objects.get(code='food_cow')
모델.name = '소_음식'
모델.save()
# 쿼리셋 형태에서 변경
update_v = {'name':'음식_소'}
모델 = 모델명.objects.filter(code='food_cow')
모델.update(**update_v)
#삭제 - DELETE
from blog.models import 모델명
# 필드 삭제
모델명.objects.get(code='food_cow').delete()
모델명.objects.filter(id_in=[1,2,3]).delete()
#장점
완벽한 객체지향
재사용, 유지보수, 리팩토링 편리성
DBMS 에 대한 종속성 줄어들음
SQL 언어를 사용하지 않고도 DB 조작 가능
#단점
복잡한 SQL 문을 생성하는데 어려움
DB 에 직접 쿼리에 보내는 것이 아니라 성능 저하