ORM은 각 언어별로 있는 기능이다. 원래 데이터베이스 서버의 어떤 데이터를 조회, 추가, 수정, 삭제 등을 할 때는 sql이라는 언어를 써야된다. 그런데 sql을 사용하지 않고, 파이썬이라면 파이썬 코드로, 자바면 자바로, 각 언어 그대로를 활용해서 sql 코드를 만들어내는 라이브러리가 있다. 그걸 ORM 이라고 한다. 장고에서는 Django Model
이 장고의 ORM이다.
모델클래스.objects
를 제공한다.Chaining
을 지원 : QuerySet 수행 리턴값이 다시 QuerySet장고에서 ORM을 통해서 CRUD를 구현하는 것에 대해서 알아보자.
IntegrityError
예외가 발생shell
을 통해서 모델을 import한 후 모델명??
명령어를 치면 상세 필드 옵션을 확인할 수 있다.model_instance = Post(author=User.objects.all()[0], title='title', text='content')
model_instance.save()
new_post = Post.objects.create(author=User.objects.get(id=1), title='title', text='content')
# chaining을 통해 조건1~3 이 적용된 queryset을 마지막에 리턴
queryset = 모델클래스명.objects.all()
queryset = queryset.filter(조건필드1=조건값1, 조건필드2=조건값2)
queryset = queryset.filter(조건필드3=조건값3)
for model_instance in queryset:
print(model_instance) # 화면에 출력할 때 DB에 쿼리 (lazy)
# 필터링 (qs1 = qs2)
qs1 = Post.objects.filter(title__icontains='1', title__endswith='3') # i = ignore_case (대소문자 구별 X)
qs2 = Post.objects.filter(title__icontains='1').filter(title__endswith='3') # 체이닝
from django.db.models import Q
모델클래스명.objects.all().filter(Q(조건필드1=조건값1) | Q(조건필드2=조건값2)) # or 조건
모델클래스명.objects.all().filter(Q(조건필드1=조건값1) & Q(조건필드2=조건값2)) # and 조건
def post_list(requests):
qs = Post.objects.all() # Post 모델클래스의 전체 데이터 저장
q = requests.GET.get('q','') # get파라미터중 q라는 값 저장
if q: # 만약 값이 있을 경우
qs = qs.filter(title__icontains=q) # 대소문자 구별없이, title에 값을 찾는다.
return render(requests, 'blog/post_list.html', {
'post_list' : qs,
'q':q,})
#blog/templates/blog/post_list.html
<form action="" method="get">
<input type="text" name="q" />
<input type="submit" value="검색" />
</form>
# myapp/models.py
#
class Post(models.Model):
....
class Meta:
ordering = ['-id'] # id 필드 기준 내림차순 정렬, 미지정시 임의 정렬
ordering = ['pub_date'] # 지정 필드 오름차순 요청
ordering = ['-pub_date'] # 지정 필드 내림차순 요청
ordering = ['-pub_date', 'author'] # 1차기준, 2차기준
queryset = queryset[:10] # 현재 queryset에서 처음10개만 가져오는 조건을 추가한 queryset
queryset = queryset[10:20] # 현재 queryset에서 처음10번째부터 20번째까지를 가져오는 조건을 추가한 queryset
# 리스트 슬라이싱과 거의 유사하나, 역순 슬라이싱은 지원하지 않음
queryset = queryset[-10:] # AssertionError 예외 발생
# 이때는 먼저 특정 필드 기준으로 내림차순 정렬을 먼저 수행한 뒤, 슬라이싱
queryset = queryset.order_by('-id')[:10]
# 지정 조건의 데이터 Row를 순회
for model_instance in queryset:
print(model_instance)
# 특정 조건의 데이터 Row 1개 Fetch (1개!! 2개이상말고 1개!! 0개말고 1개!!) model_instance = queryset.get(id=1)
model_instance = queryset.get(title='my title')
model_instance = queryset.first() # model instance 또는 None
model_instance = queryset.last() # model instance 또는 None
post_instance = Post.objects.get(id=66)
post_instance.title = 'edit title' # title 수정
post_instance.save()
queryset = Post.objects.all()
for post in queryset:
post.tags = 'Python, Django'
post.save() # 각 Model Instance 별로 DB에 update 요청 - 성능저하
queryset = Post.objects.all()
queryset.update(title='test title') # 일괄 update 요청
post_instance = Post.objects.get(id=66)
post_instance.delete()
queryset = Post.objects.all()
for post in queryset:
post.delete() # 각 Model Instance 별로 DB에 delete 요청 - 성능저하
queryset = Post.objects.all()
queryset.delete() # 일괄 delete 요청
참조 블로그
초보몽키의 개발공부로그
7. 모델을 통한 데이터 CRUD