CRUD
by
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()
Subscribe via RSS