Python/Django

[Django] ORM Queryset API - 메소드 정리

yubi5050 2022. 6. 15. 18:20

👉 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