Django의 데이터베이스 및 백그라운드 관리

데이터베이스 작업
프로비저닝
  • 드라이버 설치 --------pip install pymysql
  • 같은 이름의 하위 디렉터리__init__.py 파일에 다음 문장
    from pymysql import install_as_MySQLdb
    
    install_as_MySQLdb()
    
    을 추가하면 Django의 ORM이 mysqldb 방식으로PyMySQL
  • 을 호출할 수 있도록 합니다
  • 구성 파일 수정
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': 'localhost',  #      
            'PORT': 3306,  #      
            'USER': 'root',  #       
            'PASSWORD': '******',  #        
            'NAME': 'two_demo'  #      
        }
    }
    
  • mysql에서 동명 데이터베이스 만들기
    create database two_demo default charset=utf8;
    
  • 모델 정의
  • 데이터베이스 테이블 이름---------기본값** _ **dbtable에서 데이터베이스 이름을 자율적으로 가리키기
  • 메인 키:django는 테이블에 자동으로 증가하는 메인 키열을 만들 것입니다. 모델마다 하나의 메인 키열만 있을 수 있습니다. 만약에 메인 키를 자주 설정하면 자동으로 증가하는 메인 키열을 만들지 않습니다. 기본 메인 키의 속성은 id이고 Pk로 대체할 수 있습니다
  • 필드 속성
    타입
    설명
    AutoField
    자동으로 증가하는 IntegerField - 일반적으로 지정하지 않고 자동으로 증가하는 등록 정보를 생성합니다.
    BooleanField
    부울 유형, True 및 False
    NullBooleanField
    Null, True, False 세 가지 데이터 유형 지원
    CharField
    문자열, 매개 변수 maxlength는 최대 문자 수를 표시합니다
    TextField
    일반적으로 4000자 이상
    IntegerField
    정수
    DecimalField
    십진 부동 소수점 수, 매개 변수 maxdigits는 총 자릿수, decimal 매개변수를 나타냅니다.places는 소수 비트를 표시하는데 보통 저장 금액에 쓰인다
    FloatField
    부동 소수점 수
    DateField
    날짜, auto 매개변수가 두 개 있음now_add 및 autonow_add;여기서 autonow_dd 기본값은false이고true로 설정되면 이 필드를 저장할 때 현재 시간으로 설정하고 변경할 때마다 자동으로 업데이트됩니다.autonow_dd 기본값도false입니다.true로 설정하면 모델이 처음 만들어졌을 때 필드의 값을 만드는 시간으로 설정하고 나중에 대상을 수정할 때 필드의 값을 업데이트하지 않습니다.두 개를 조합해서 사용할 수 없으므로 서로 배척할 수 있으니 주의하시오
    TimeField
    시간, 매개 변수는 DateField와 같습니다.
    DateTimeField
    날짜 시간, 매개 변수는 DateField와 같습니다.
    FileField
    파일 업로드 필드
    ImageField
    FileField 에 상속되어 업로드된 내용을 검사하여 올바른 그림인지 확인
  • 외부 키를 설정할 때 **on_delete** 옵션을 통해 메인 테이블의 데이터를 삭제해야 한다. 외부 키 인용 테이블 데이터가 어떻게 처리되는지 다음과 같은 옵션 상수가 있다.
  • CASCADE----------캐스케이드, 마스터 테이블 데이터 삭제 시 테이블에서 함께 삭제
  • PROTECT--------------보호, ProtectedError 이상을 던져서 메인 테이블에 외부 키로 적용된 데이터 삭제를 막는다
  • SET_NULL ------- NULL로 설정하고 이 필드만 null=True에서 null로 허용
  • SET_DEFAULT------ 기본값으로 설정하고 이 필드에 기본값이 설정된 경우에만 사용할 수 있음
  • SET () ------------ 특정 값으로 설정하거나 특정 방법을 호출

  • 옮기다
  • 마이그레이션 파일 생성
    python manage.py makemigrations
    
  • 데이터베이스에 동기화
    python manage.py migrate
    
  • 데이터베이스----- 증가
  • save()
    def create_book(request):
        #        
        book = BookInfo()
        book.bname = "   "
        book.bdate = "1980-01-01"
        book.bcomment = 500
        book.breaded = 10000
        book.save()
    
  • create()
    BookInfo.objects.create(
            bname="   ",
            bdate="1980-05-03",
            bcomment=500,
            breaded=5000
        )
    

  • 데이터베이스 --- 삭제
  • 모델류 대상.delete()
    def delete_hero(request):
        #        
        # hero = HeroInfo.objects.filter(hname="   ").first()
        # hero.delete()
    
    
  • 모델류.objects.filter().delete()
    #    
        HeroInfo.objects.filter(hname="   ").delete()
    

  • 데이터베이스 --- 수정
  • save
    def update_hero(request):
        #    
        # hero = HeroInfo.objects.filter(hname="   ").first()
        # hero.hname = "   "
        # hero.save()
    
    
  • objects.filter().update()
    #    
        HeroInfo.objects.filter(hname="   ").update(hname="   ")
    

  • 데이터베이스 ----조회
    기본 질의
  • get 조회 단일 결과, 모델 클래스가 존재하지 않으면 던집니다.DoseNotExist 예외
  • all 쿼리 복수 결과
  • count 조회 결과 수량
  • #      1   [    ]
        #   filter           
        book = BookInfo.objects.filter(id=1)
        book = BookInfo.objects.get(id=1)
    
        # pk    
        book = BookInfo.objects.get(pk=1)
        print(book)
    
        #       
        #           
        allbook = BookInfo.objects.all()
        print(allbook)
    
        #          
        number = BookInfo.objects.count()
        print(number)
        
        #     ,  
        BookInfo.objects.get(id=100)
        Traceback (most recent call last):
            db.models.DoesNotExist: BookInfo matching query does not exist.
    

    질의 필터링
  • Filter에서 여러 결과 필터
  • exclude 조건에 부합되는 나머지 결과 배제
  • get 필터 단일 결과
  • 표현식 형식은 ** __ = **
  • exact-----는 서로 같다
    BookInfo.objects.filter(id__exact=1)
        :
    BookInfo.objects.filter(id=1)
    
  • contain 포함
    #            [  ,   ]
     book = BookInfo.objects.get(bname__startswith="  ")
    
    #      ,    
    book = BookInfo.objects.get(bname__endswith="  ")
    
    #             
    book = BookInfo.objects.filter(bname__contains="  ")
    print(book)
    
    
  • 빈 조회-------isnull
     #            
        # book = BookInfo.objects.filter(bname__isnull=False)
        # print(book)
    
  • 범위 조회 -------in: 지정된 범위에 포함되는지 여부
    #        1, 3, 5   
    book = BookInfo.objects.filter(id__in=[1, 3, 5])
    print(book)
    
  • 비교 조회
  • gt-보다 크다
  • gte-보다 크다
  • lt- 작음
  • lte-보다 작음
  • 같지 않은 연산자, exclude()
    #       3   
    book = BookInfo.objects.filter(id__gt=3)
    print(book)
        
        
    #         3   
    #book = BookInfo.objects.filter(id__gte=3)
     print(book)
    
       
    #        3   
     book = BookInfo.objects.exclude(id=3)
     print(book)
    
  • 사용 가능
  • 일자 조회
  • year、month、day、week_day、hour、minute、second
    #   1980      
     book = BookInfo.objects.filter(bdate__year=1980)
     #     
     book = BookInfo.objects.filter(bdate__year__exact=1980)
     print(book)
    
        
    #  1980 1 1        
    #   date            
    book = BookInfo.objects.filter(bdate__gt=date(1980, 1, 1))
    print(book)
    
    



  • F 객체 및 Q 객체
    F 객체 ----- 두 속성 간 비교 가능
    #              F
    #                
    book = BookInfo.objects.filter(breaded__gte=F('bcomment'))
    print(book)
    
    #        2       
    #   F               
    book = BookInfo.objects.filter(breaded__gt=F('bcomment')*2)
    print(book)
        
        
    # 2.1   id=1   ,        1
    #    ,   id=1   ,       
    book = BookInfo.objects.get(id=1)
    book.bcomment += 1
    book.save()
    
    #    ,           
    book = BookInfo.objects.filter(id=1).update(bcomment=F('bcomment')+1)
    print(book)
    

    Q 개체
  • 형식 ---------Q(속성명 연산자) = 값
  • #          ,    Q     
    #        20,     3   ,    Q    
    book = BookInfo.objects.filter(Q(breaded__gt=20) | Q(id__lt=3))
    print(book)
    
        
    #        3   ,   Q    
    #    Q      "~",        ,   exclude
     book = BookInfo.objects.filter(~Q(id=3))
     print(book)
    

    집합 함수
  • **aggregate()** 필터를 사용하여 집합 함수를 호출합니다. 집합 함수는 Avg, Count, Max, Min, Sum
    # - == =      == ==
    #           
    #   aggregate       (Sum,Avg,Count,Max,Min),          
     number = BookInfo.objects.aggregate(Sum('breaded'))
     print(number)
    
    #         
    number = BookInfo.objects.aggregate(Max('bcomment'))
    print(number)
    
    #       ,        ,   [  ]
    #   
    book = BookInfo.objects.all().order_by('breaded')
    
    #              "-",            
    book = BookInfo.objects.all().order_by('-breaded')
    print(book)
    
  • 연관 질의 및 연관 필터링 질의
    # - == ==    == ==
    #        1,        
    #          relate_name  ,      .    _set.all()                
    book = BookInfo.objects.get(id=1)
    hero = book.heroinfo_set.all()
    
    #        relate_name  ,       .  .all()                
    book = BookInfo.objects.get(id=1)
    hero = book.hero.all()
    print(hero)
    
    # - 2.
    #             ,      
    book = BookInfo.objects.get(bname="    ")
    hero = book.hero.all()
    # hero = book.heroinfo_set.all()
    print(hero)
    
    # - 3.
    #        1,      
    #            ,    .      
    hero = HeroInfo.objects.get(id=1)
    book = hero.hbook
    print(book)
    
    # - == =        == ==
    #         ,    
    #               
    book = BookInfo.objects.filter(hero__hname="  ")
    print(book)
    
    # - 2.
    #              
    book = BookInfo.objects.filter(hero__hname__contains=" ")
    print(book)
    
    # - 3.
    #          30,        
    hero = HeroInfo.objects.filter(hbook__breaded__gt=30)
    print(hero)
    
    # 4        5   
    data = HeroInfo.objects.all()[:5]
    print(data)
    
    

    Query Set
    콘셉트
  • 개념: 조회 집합, 조회 결과 집합이라고도 부르며 데이터베이스에서 얻은 대상 집합
  • 을 나타낸다
  • all(), Filter(), exclude(),order 를 호출할 때by()

  • 양대 특성
  • 타성 실행 조회 집합은 데이터베이스에 접근하지 않고 데이터를 호출할 때까지 데이터베이스에 접근하지 않는다
  • 캐시는 같은 조회 집합을 사용한다. 처음 사용할 때 데이터베이스 조회가 발생하고 Django는 결과를 캐시한다. 이 조회 집합을 다시 사용할 때 캐시된 데이터를 사용하여 데이터베이스 조회 횟수를 줄인다
  • 관리자
    사용자 정의 관리자
    참고: 모델 클래스에 사용자 정의 필터를 지정하면 Django에서 기본 관리 객체 Objects를 생성하지 않습니다.
    #       ,   models.Manager
    class BookInfoManager(models.Manager):
        #   all()  
        def all(self):
            #        False   (              )
            return super().filter(is_delete=False)
    
        #       ,            
        def create_book(self, bname, bdate):
            book = self.model()
            book.bname = bname
            book.bdate = bdate
            book.breaded = 0
            book.bcomment = 0
            book.is_delete = False
            book.save()
            return book
    	
        #           
        class BookInfo(models.Model):
        	...
        	books = BookInfoManager()
        
        
        # ==             == #
        #                   
        book = BookInfo.books.all()
        print(book)
    
        #     books       objects        
        book = BookInfo.books.create_book("    ", date(2015, 5, 1))
        print(book)
    

    Admin 사이트
  • 슈퍼 관리자 만들기
    python manage.py createsuperuser
    
  • 관리자 비밀번호 사용 명령 수정
    python manage.py changepassword    
    
  • 등록모델류
    admin.site.register(    )
    
  • 사이트 정보 조정
  • admin.site.site_header(사이트 헤더 설정)
  • admin.site.site_title(페이지 제목 설정)
  • admin.site.index_title(첫 페이지 표어 설정)
  • 좋은 웹페이지 즐겨찾기