Today I Learned/django
장고(django) QuerySets와 매니저로 작업하기
하나719
2023. 7. 18. 10:40
반응형
Django의 ORM을 사용해서 데이터베이스 사용하는 방법
- 터미널에서 작업하중인 경로로 이동
- cd mysite
- manage.py 파일에서 shell 열기
- python manage.py shell
- 모듈 import
- from django.contrib.auth.models import User (장고가 제공하는 유저 정보, 어드민 등록 후 사용)
- from blog.models import Post (내가 만든모델)
- 유저 정보 가져오기
- user = User.objects.get(username = 'admin')
- 포스트 정보 가져오고 저장하기
- post = Post(author = user)
- post.save()
- 포스트 id 출력해보기
- post.id
- 전체 글 가져오기
- all_posts = Post.objects.all()
- print(all_posts)
- 필터링 (조건) 걸어서 특정 값 가져오기 : filter(column__조건)
- Post.objects.filter(publish__year=2023)
- 포함: Post.objects.filter(publish__year=2023).filter(title__startswith ='아')
- 제외: Post.objects.filter(publish__year=2023).exclude(title__startswith ='아')
- 정렬: order_by(column)
- Post.objects.order_by('title') : 오름차순
- Post.objects.order_by('-title') : 내림차순
- 값 가져오기: get(컬럼 = 값)
- Post.objects.get(id=4)
- Post.objects.get(status ='DF)
- 사용자정의 매니저 사용하기 -> models.py 에 코드 수정 필요
- why? : 항상 사용하는 필터링 조건이 있다면, 사용자정의 매니저로 만들어서 모든 객체가 아닌 특정 객체를 기본으로 검색 할 수 있습니다.
- 사용 방법:
- 기본 객체: Post.objects.all()
- 사용자정의 객체: Post.published.all() (published가 아니라 사용하고 싶은 조건으로 얼마든지 가능)
<models.py>
published를 사용할 경우, 항상 status = 'PUBLISHED' 인 조건으로 필터링되도록 PublishedManager 클래스를 정의
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status=Post.Status.PUBLISHED)
class Post(models.Models):
... #생략
... #생략
... #생략
objects = models.Manager() #기본 매니저
published = PublishedManager() #사용자 정의 매니저
class Meta:
ordering = ['-publish']
indexes = [
models.Index(fields=['-publish']),
]
def __str__(self):
return self.title
아래 실습 화면을 보면, Published 객체를 사용했을 때 all()로 출력해도 '빵' 포스트가 출력되지 않은 걸 확인할 수 있다.
(빵 status= 'DRAFT')
반응형