👉 1. 생성
- .create() : 데이터 1개만 생성
- .bulk_create() : 데이터 여러개 생성
- .get_or_create() : 조회 후 없으면 생성
# Create
TeamBoard.objects.create(id=12, team='L', score=3, lastyear_ranking=11)
# Create 여러개
TeamBoard.objects.bulk_create([
TeamBoard(team='M', score=2, lastyear_ranking=12),
TeamBoard(team='N', score=2, lastyear_ranking=12),
TeamBoard(team='O', score=1, lastyear_ranking=13)
]);
# 조회 후 없으면 Create
TeamBoard.objects.get_or_create(lastyear_ranking=16,
defaults={
'team':'Z','score':2
}
)
👉 2. 조회
- .all() : 전체 데이터 조회 (queryset 리스트의 모델 객체로 리턴)
- .get() : 1개의 데이터만 조회
- .filter() : 여러개 데이터 조회
- .values(<column>) : 특정 column만 조회 (queryset 리스트의 Dict로 리턴)
- .values_list(<column>) : 특정 column만 조회 (queryset 리스트의 Tuple로 리턴)
- .only(<column> : 특정 column + id 필드 무조건 포함 조회 (queryset 리스트의 모델 객체로 리턴)
TeamBoard.objects.all() # 모두 조회
TeamBoard.objects.get(id=1) # 데이터 한 개만 조회
TeamBoard.objects.filter(ranking=11) # ranking이 11인 데이터들 조회
TeamBoard.objects.values('id') # 데이터들 dict 형태 조회 + 특정 필드값들만
TeamBoard.objects.values_list('name', 'ranking') # 데이터 tuple 형태 조회 + 특정 필드값들만
TeamBoard.objects.only('name') # Queryset 형태 조회, 단 id 값 필수 포함
👉 3. 수정 (업데이트)
- .get() => 값 수정 => .save()
- .filter() => .update()
- .update_or_create() : 객체를 업데이트시 없다면 생성
# 한 개의 데이터만 수정 (업데이트)
data = TeamBoard.objects.get(id=12)
data.score = 12
data.save()
# 여러개 데이터 수정 (업데이트)
TeamBoard.objects.filter(lastyear_ranking=11).update(score=15
# 수정 후 없으면 생성
TeamBoard.objects.update_or_create(lastyear_ranking=18,
defaults= {
'team':'Za','score':3,'lastyear_ranking':18
}
)
👉 4. 삭제
- .get() or .filter() => .delete()
# 한개만 삭제
TeamBoard.objects.get(lastyear_ranking=13).delete()
# 여러개 삭제
TeamBoard.objects.filter(lastyear_ranking=11).delete()
👉 5. 조건 형 조회
- .exclude() : 조건값 제외한 데이터 조회
- .first(), .last() : 조회 데이터의 처음/마지막 레코드 조회
- .filter(<필드명__조건>) : filter 안에 조건식을 인자로 넘겨주어 조회 가능
l : less / g:greater / t : than / e:equal
__startswith : 조건값 시작 데이터 / __endswith : 조건값 끝나는 데이터 / __contains : 조건값 포함 데이터
__in : 해당 값을 포함했는지 (항상 [ ] 붙여 줘야 함)
ex) lt, gt, lte 등 은 날짜 비교에도 많이 쓰임. - .Q () : 조건 연결
# 조건문 필터 조건
TeamBoard.objects.exclude(team='A') # A팀 제외한 나머지
TeamBoard.objects.filter(score__lte=20) # x <= 20
TeamBoard.objects.filter(score__gt=20) # x > 20
TeamBoard.objects.filter(team__in = ['A','B']) # A나 B가 있는지
TeamBoard.objects.filter(team__startswith='A') # 시작 문자가 A
TeamBoard.objects.filter(team__istartswith='a') # 시작 문자가 A or a (대소문자 구분 X)
TeamBoard.objects.filter(team__endswith='A') # 끝 문자가 A
TeamBoard.objects.filter(team__contains='A') # A 포함하고 있는지
# 조건문 여러개 Q
TeamBoard.objects.filter(Q(score__gte=80) & Q(team__contains='A')) # score가 80보다 크면서, 팀명에 A 포함
TeamBoard.objects.filter(Q(score__gte=80) | Q(team__contains='A')) # score가 80보다 크거나, 팀명에 A가 포함되거나
TeamBoard.objects.filter(Q(score__gte=50) | ~Q(team__contains='A')) # score가 50보다 크거나, 팀명에 A가 포함 안되거나
👉 6. 편의성 응용 함수
- .annotate()
# Annotate로 KEY값 주석 추가
result = TeamBoard.objects.annotate(cnt = Count('id'))
result[0].cnt # 17
.F () : 모델 필드의 값을 참조해 메모리 로드 없이 DB 작업 수행 가능
👉 7. 기타
- .exists() : 데이터 존재 확인
- .count() : 데이터 갯수 확인
- .order_by() : 필드 순서로 정렬
- .aggregate() : 집계함수 모듈
- union(), intersection() : 교집합, 합집합 모듈
- union, intersection의 경우 필드가 같은 것들을 대상으로 진행 가능
- 만약 필드를 맞춰주고 싶다면 value_list()로 공통 필드만 맞춰서 union 진행
TeamBoard.objects.filter(lastyear_ranking=16).exists() # True or False
TeamBoard.objects.filter(lastyear_ranking=16).count() # 10
TeamBoard.objects.all().order_by('lastyear_ranking') # 정렬
TeamBoard.objects.all().order_by("-lastyear_ranking") # 역순 정렬
TeamBoard.objects.all().order_by("?") # 랜덤 셔플
from django.db.models import Avg
TeamBoard.objects.all().aggregate(sc_avg = Avg('score')) # {'score__avg': Decimal('37.2142857142857')}
# intersection
data1 = TeamBoard.objects.filter(name__in=["A", "C"])
data2 = TeamBoard.objects.filter(name__in=["A", "B"])
data3 = intersection(data1, data2)
# union
data1 = TeamBoard.objects.filter(name__in="A")
data2 = TeamBoard.objects.filter(name__in="B")
data3 = data1.union(data2) # union된 객체를 return 함
👉 8. 기타
# sql query 출력해보기
queryset = TeamBoard.objects.all()
print(str(queryset.query))
참고링크
https://velog.io/@jinukix/django-Queryset
https://django-orm-cookbook-ko.readthedocs.io/en/latest/select_some_fields.html // orm cookbook
'Python > Django' 카테고리의 다른 글
[Django] User 모델 작성 방법 비교 (AbstractUser vs AbstractBaseUser) (0) | 2022.06.19 |
---|---|
[Django] CBV (클래스 기반 View) vs FBV (함수 기반 View) (0) | 2022.06.19 |
[Django] 무식한 라이브러리 분해 4 (settings.py) (0) | 2022.06.15 |
[Django] CSRF Token + Form 방식 (0) | 2022.06.12 |
[Django] CSRF Token + Ajax 비동기 통신 (0) | 2022.06.12 |