2019년 1월 24일 목요일

Django Model


Django Model



선행지식  :  python Class  👈👈


Model이라는건 무엇일까


Model은 data를 보관하는 방이라고 생각을 하자

Database와 Model을 대응시켜 생각해보면



Database = Model 

table       = Class

data        = Object



실생활에 빗대어보면 옷방이 Model 이고

양말서랍, 잠옷서랍, 바지서랍 이 Class이면

그안에 들어있는 양말, 양말, 양말, 잠옷, 바지, 바지 가 모두 Object이다

머릿속에 그림을 그려보자



이처럼 Model은 결국 Object 즉 data를 다루는 곳이므로 model.py에서는

data에 대한 유효성검사(제대로 된 애를 받았는가?)와 같은 작업이 이루어지기도 한다


그리고 우리가 쓴 __str__은 객체를 표현할때 사용되는 메서드인데

reference를 봤는데 얘말고는 딱히 눈여겨 볼만한 애가 없었다




Migration


이주라는 뜻의 Migration은 무엇일까

Migration은 DB스키마의 버전 제어 시스템이다

makemigrations [model name(생략시 all)] 이런식으로 사용을 하는데

model의 변경사항(add filed, remove model, etc..)을 바탕으로 구조를 짠다고 생각하면 되겠다

migrate [model name(생략시 all)] 를 해주면 그 구조안에 model을 반영해주는 것이라 생각하자



사용법 



python manage.py makemigration

python manage.py migrate

python manage.py showmigrations 프로젝트의 migration list와 status를 보여줌


Django에서 모델을 사용하는 flow(3주차 기준)

 

   1.  model을 사용하고 싶으니 model.py를 조작해줘야하는데

       model을 구성하는것은 Class랬다. Class를 만들어주자



       class Blog(models.Model):

      title = models.CharField(max_length =200)

      pub_date = models.DateTimeField('date published')

      body = models.TextField()


   💬 Field의 종류

       
       
       Char Field[max_length = None(default)]     :   작은 크기의 문자열을 나타내는 필드

       Text Filed            :    긴 문자열을 받는 필드
 
       Integer Field        :    Integer를 받는 필드

       Date Field[auto_now=Flase(default), auto_now_add=False)   :  날짜 필드
       DateTime Field

       Email Field(max_length=254)       :    charfield인데 EmailValidator를 이용 이메일인지 검사
       Filed Field(upload_to = None <-- 업로드할경로  )      :     파일 업로드하는 필드
       
       Field File  파일 객체의 instance를 제공해 조작가능

       Image Field(upload_to = None, height_field=None, width_field)

       URL Field    : charfiled인데 URLValidator를 이용해 URL을 받았는지 유효성 검사

       Binary Field          :      이진 data를 받는다

       Boolean Field       :      true와 false를 받는다

   2.   model안에 Class를 생성해서 model에 변화를 주었으면? DB에 알려 모델의 구조를 등록하자

     
        python manage.py makemigration

        python manage.py migrate





   3.  이러한 model들을 관리하기 위한 도구가 필요해서 admin을 이용하고싶다
     
       관리자 계정을 만들자
     

        python manage.py createsuperuser

 



   4.   admin계정을 만들었지만 admin으로 관리하기 위해선 모델을 admin과 연결해 줘야하는데?
       admin.py 에 admin.site.register(Blog) 로 내 model의 Class를 admin에 등록해주자


       그런데 이때! 다른 파일에서 Class를 가져오는 것이므로

       ⭐from .model import blog 잊지말자





   5.  이제 Model부분을 만들었으니까 사용을 해야하는데 ( views에서 model을 사용해줘야하니 import 필수)
     


       꺼내오기 :

                    views.py에서 Blog . objects 와 같이 Blog라는 Class가 가진 객체들을 다룰 수 있다
   
                     (여기서 Blog.objects는 클래스 변수인듯)





   5-5. 이때 객체들은 QuerySet의 형태로 넘어오는데
     
         QuerySet method를 이용해 조작해줄수 있다.




   6 . view에서 templates로 context(dictionary형태로 넘어가는 data라 생각하자))로 넘어가면 data를 템플릿 태그와 템플릿 변수를 이용해서 사용하자.
       


❔ QuerySet 



QuerySet은 모델의 객체들의 집합이라고 생각해주자



QuerySet method   (chain처럼 연결해서 사용가능 filter().count()  )

filter(조건)              조건에 부합하는 객체가져옴

exclude(조건)          조건에 맞는 객체 빼고 가져옴

order_by(조건)         조건에 따라 정렬
                   
                            default  : 오름차순  /   -  :  내림차순    /    ?  :  무작위


reverse()                 역으로 정렬

get(조건)                조건에 부합하는 1개의 객체 가져옴

count(조건)             조건에 맞는 객체 갯수 가져옴

first()/last()              첫번째/마지막 객체 가져옴

exist(조건)               조건을 만족하는 애가 존재 하는지 true/false로 나타냄

distinct()                 중복된것을 제외한 count ( 예 [1,2,2,3]의 count == 4 distinct == 3)

values(객체,객체)      객체에 해당하는 애들만 가져옴
                           ( object가 name, age, gender를 가질 때 value(name, age)하면 name과 age값만 가져옴)




가장 많이 본 글