개발/파이썬
djangogirls| 6. ORM, QuerySets : 데이터베이스 연결
연별(YeonStar)
2020. 10. 29. 21:32
QuerySets (쿼리셋)
- 쿼리셋 : 모델의 객체 목록
- 쿼리셋으로 데이터베이스로부터 데이터베이스를 읽고, 필터링하거나, 정렬할 수 있음
- 쿼리셋 사용법: 쿼리셋으로 데이터베이스의 정보를 읽어오기
- 앱(blog)의 모델(Post)을 불러와서(=쿼리셋), 데이터베이스의 모든 글(object, 객체)을 읽어옴
#command-line
>>> from blog.models import Post
>>> Post.objects.all()
<QuerySet [<Post: my post title>, <Post: another post title>]>
- 쿼리셋 사용법: 쿼리셋으로 데이터베이스에 정보 저장하기
- 앱(blog)의 모델(Post)을 불러와서(=쿼리셋), 데이터베이스에 새 글(object, 객체)을 저장함(create)
#command-line
>>> Post.objects.create(author=me, title='Sample title', text='Test')
- 참고로, 사용자(User) 모델의 인스턴스를 전달해야함.
#command-line
>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: ola>]>
>>> me = User.objects.get(username='ola')
>>> Post.objects.create(author=me, title='Sample title', text='Test')
>>> Post.objects.all()
<QuerySet [<Post: my post title>, <Post: another post title>, <Post: Sample title>]>
- 쿼리셋 사용법: 쿼리셋으로 데이터베이스 필터링하기
- 모든 객체.filter(조건)
- title__contains : 밑줄 2개, 필드이름(title) 및 연산자(contains)
#command-line
>>> Post.objects.filter(author=me)
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]
>>> Post.objects.filter(title__contains='title')
[<Post: Sample title>, <Post: 4th title of post>]
- 쿼리셋 사용법: 쿼리셋으로 저장한 글(object)를 얻어서(get) 게시(publish)하기
#command-line
#Sample title라는 제목의 글(objet)를 얻어오기
>>> post = Post.objects.get(title="Sample title")
#게시글을 publish method로 publish하기
>>> post.publish()
#게시일로 과거에 작성한 글을 필터링하기
>>> Post.objects.filter(published_date__lte=timezone.now())
[<Post: Sample title>]
- 쿼리셋 사용법: 쿼리셋으로 글(객체) 목록을 정렬하기
- created_date 필드를 정렬하기
- 기본으로 오름차순, - 을 붙이면 내림차순
#command-line
#오름차순: 생성일 기준
>>> Post.objects.order_by('created_date')
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]
#내림차순: 생성일 기준
>>> Post.objects.order_by('-created_date')
[<Post: 4th title of post>, <Post: My 3rd post!>, <Post: Post number 2>, <Post: Sample title>]
- 쿼리셋 사용법: 쿼리셋들을 chaining하여 복잡한 필터링
- 모든객체.filter(조건).order_dy('필드 이름')
#command-line
>>> Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
쿼리셋: https://docs.djangoproject.com/en/2.0/ref/models/querysets/