CRUD

주피터 사용시 모델에 대한 정보는 Profile?? 와 같은 명령을 통해 알 수 있음. 주피터는 사용하는 모델을 자동으로 임포트함.

조회(Retrieve)

ModelCls.objects.all().oredr_by('-id')[:10]
ModelCls.objects.creat(title="필수필드 모두 기재")
queryset=Post.objects.all().filter(title__icontains="포함된 텍스트")
  • 포함된 텍스트가 제목에 들어간 쿼리셋(i: 대소문자 구별 무시)

And 조건

queryset=Post.objects.all().filter(title__icontains="포함된 텍스트").filter(title__endswith="끝문장")
  • 위조건에 추가여 끝문장으로 끝나는 제목을 가진 텍스트
  • queryset=Post.objects.all().filter(title__icontains=”포함된 텍스트”,title__endswith=”끝문장”) : 같은 조건임

Post.objects.all().filter(title__icontains=”포함된 텍스트”).exclude(title–endswith=”끝제외”)

  • 포함된 텍스트로 시작하는 것중 끝제외로 끝나는 것을 제외한 쿼리셋

Or 조건

from django.db.models import Q
queryset= ModelCls.objects.all()
queryset.filter(Q(title__icontains= '1') | Q(title__endswith='3'))
  • 위 과정에서 DB Access는 이루어지지 않음. 실제 print같은 명령이 있을 때 접근함.

  • 검색기능 구현

# myapp/views.py
def post_list(request):
  qs = Post.objects.all()

  q = request.GET.get('q','')
  if q:
    qs = qs.filter(title__icontains = q)

  return render(request, 'blog/post_list.html',{
    'post_list':qs,
    'q': q,
    })

  #templates/blog/post_list.html
  <form action="" methon="get">
    <input type='text' name="q"  value=""/>
    <input type="submit" value="검색"/>
  </form>
  • 데이터베이스에 정렬 조건 추가
class Post(models.Model):
  #### 필드정의
  class Meta:
    ordering =['-id']
    

데이터정렬관련 문서

Fetch

  • queryset.get(id=1)
    • 해당조건이 1개가 아니면 예외발생
  • queryset.first() 또는 queryset.last()
    • 조건에 맞는게 없어도 예외발생하지 않고 None을 리턴

추가(Create)

  1. Model instance의 save()를 이용 instance = Post(name=”hvo”, title=”create”) # 저장전 instance.save() # 비로소 저장됨

  2. Model Manager의 create 를 이용 Post.objects.create(name=”hvo”, title=”create”)

    • 추가된 쿼리셋 반환

갱신(Update)

  1. 속성변경후 save()를 이용 post = Post.objects.get(id=1) post.tags = “tag변경” post.save()
    • 다수 row에 대해 각각하면 성능저하 발생
  2. QuerySet의 update 이용 queryset=Post.objects.all() queryset.update(tag=”tag변경”)
    • 변경된 개수를 리턴함.
    • 다수의 변경을 하나의 SQL로 전달함.

삭제(Delete)

  1. instance에 delete 호출 post = Post.objects.get(id=1) post.delete

  2. QuerySet의 delete함수를 호출 queryset = Post.objects.all() queryset.delete()

Tip

  • 위의 경우를 살펴보면 1의 방법은 하나의 쿼리셋을 찾고 이에 대한 작업실시. 즉 여러개의 쿼리에 대해서는 for문을 이용하여 돌려야 하는데 이때 각각의 작업에 SQL이 작성되므로 성능저하됨.
  • 2의 방법이 훨씬 효율적임.
  • 요청반응속도는 대부분 DB에서 결정됨.

Tags:

Updated:

Leave a Comment