CRUD

  • QuerySet
    • SQL을 생성해 주는 인터페이스
    • ModelClass.object.all() = select * from ModelClass
    • ModelClass.object.create(...) = Insert into ... ModelClass
    • 데이터를 가져올 query문만 생성해 주는것이고 실제로 DB에서 데이터를 가져오려면 추가적인 구문이 필요
    • jupyter notebook에서는 Queryset만 입력하면 jupyter notebook이 db에 액세스 해서 데이터를 가져옴
    • instance = Model.objects.all() 하면 query 결과 인스턴트들을 변수에 담아놓음
  • Model 객체 출력시 자동으로 보여줄 컬럼 선택
#app/models.py
class Study(models.Model):
	...
	def __str__(self):
		return self.title
  • AND,OR 조건 사용하여 데이터 가져오기
from django.db.models import Q
Study.objects.filter(Q(title__icontains='1') | Q(title__icontains='3'))
#select * from Study where title LIKE '%1%' OR title LIKE '%3%'
#OR는 Q를 통해서 접근 가능

Study.objects.filter(Q(title__icontains='1') & Q(title__icontains='3'))
Study.objects.filter(Q(title__icontains='1'),Q(title__icontains='3'))
#select * from STudy where title like '%1%' AND title like '%3%'

Study.objects.filter(title__icontains='1').exclude(title__icontains='3')
#select * from Study where title like '%1%' AND title not like '%3%'
  • icontains & contains : i = ignore case를 의미(대소문자 구분X)

R(read) - 데이터 조회

  • 전체 목록 조회
#app/view.py
from .models import Study

def study_list(reqeust):
	qs = Study.objects.all()
	return render(request, 'study/study_list.html', {
      'study_list':qs,
	})
<!-- study_list.html -->
<ul>

{% for study in study_list %}
	<li>
      {{ study.id }}
      {{ study.title }}
      <small>by {{ study.writer }}</small>
      <small>by {{ study.created_at }}</small>
	</li>
{% endfor %}

</ul>
  • 검색조건 추가
<!-- study.html -->
<form action="" method="get">
	<input type="text" name="q" value="q">
	<input type="submit" value="검색">
</form>
#app/views.py

def study_list(request):
  ...
  q = request.GET.get('q','')
  if q:
    qs = qs.filter(title_icontains=q)
  return render(request, 'study/study_list.html',{
      'study_list': qs,
      'q': q,
  })
  • 기본 정렬조건 추가
#app/models.py
class Study(models.Model):
	...
	class Meta:
		ordering = ['-id']
    #queryset 생성시 .orderby 지정하지 않으면 ordering 으로 기본 설정한 orderby 기준으로 정렬
    #필드에 -가 붙으면 내림차순
  • queryset.get
    • 조건에 해당되는 데이터가 1개임을 기대
    • 조건에 해당되는 데이터가 없을때: MOdelCls.DoesNotExist 예외 발생
    • 1개 매칭: 정상적으로 처리
    • 2개 이상 매칭: ModelCls.MultipleObjectsReturned 예외 발생
  • queryset.firser && queryset.last
    • 조건 내에서 첫번째 혹은 마지막 데이터 row get
    • 조건에 해당하는 데이터가 없어도 DoesnotExists 예외 발생 x, return None

C(create) 데이터 추가

  • 필수필드를 모두 지정을 해야함

  • 필수필드를 모두 지정하지 않으면 IntegrityError 발생

  • 방법 1) Model instance의 save함수를 통해 저장

    model_instance = ModelClass(field1 = value1, field2 = value2)
    model_instance.save()
    #db에 저장을 시도하고 db로 부터 id 할당받음
    
  • 방법 2) Model instance의 create 함수를 통해 저장

    model_instance = ModelClass.objects.create(filed1 = value1, field2 = value2)
    #db에 저장을 시도하고 db로 부터 id 할당받음	
    

U(update) 데이터 갱신

  • 방법 1) Model instance를 획득한뒤 속성을 변경하고 save 함수를 통해 저장

    instance = ModelClass.objects.get(id=1)
    instance.title = 'New title'
    instance.save()
    
    qs = ModelClass.objects.all()
    for q in qs:
      q.title = 'new title'
      q.save()
    #다수의 row에 대해 update 수행시 성능저하가 발생할 수 있음
    
  • 방법 2) QuerySet 의 update 함수에 업데이트할 속성을 지정하여 일괄 수정

    qs = ModelClass.objects.all()
    qs.update(title = 'new title')
    #하나의 sql문으로 db에 전달되고 동작하기 때문에 동작이 빠르다
    

D(delete) 데이터 삭제

  • 방법 1) 각 Model instance의 delete 함수를 호출하여 관련 데이터 삭제

  • 각 instance 별로 sql 수행

  • 다수 row에 대해서 동작시 성능저하 발생 가능

    instance = ModelClass.objects.get(id='1')
    instance.delete()
    
    qs = ModelClass.objects.all()
    for q in qs:
      q.delete()
      #각 instance별로 db에 delete 요청
    
  • 방법 2) queryset 의 delete 함수를 호출하여 관련 데이터 삭제

  • 하나의 sql로 동작하므로 동작이 빠르다

    qs = ModelClass.objects.all()
    qs.delete()