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')

 

반응형