상세 컨텐츠

본문 제목

3. MVT방식 - (1) Model

Django

by evaseo 2021. 5. 11. 13:34

본문

1.    Model

(1)     데이터베이스 변경 사항(ex. 테이블 생성, 테이블 변경)이 발생하면, 데이터베이스에 실제로 반영해주는 작업을 정의

(2)     장고 1.7버전부터 마이그레이션 개념 사용

(3)     마이그레이션(Migrations): 테이블 및 필드 생성, 삭제, 변경 등과 같이 데이터베이스에 대한 변경 사항을 알려주는 정보

(4)     장고는 마이그레이션 정보를 추출하고 이를 실제 데이터베이스에 반영함

(5)     model.py에 작성 논리적 테이블 생성

1)         ORM기법에 따라 테이블을 Django.db.models.Model클래스를 상속받는 클래스로 정의

 

     ORM(Object Relational Mapping)기법

 장고에서 데이터 베이스를 처리하는 방법

테이블에 대한 CRUD기능을 클래스 객체에 대해 수행하면, 장고가 내부적으로 SQL 처리를 하여 데이터베이스에 반영해주는 방식

 

2)         클래스의 이름은 논리적 테이블의 이름

3)         db에 저장되는 물리적 테이블의 이름은 프로젝트명_논리적이름

4)         Django에서는 논리적이름을 사용해도 되지만 db나 다른 프로그램에서는 물리적 이름을 사용

5)         컬럼은 클래스의 변수로 매핑

6)         primary key를 따로 설정하지 않으면 기본적으로 Django에서 primary key id를 자동 생성함

7)         기존에 생성되어 있는 데이터베이스의 테이블 사용

        테이블의 구조를 클래스 코드로 입력

        테이블의 구조를 코드로 변환해주는 방법

i.     settings.py DATABASES리스트의 ‘name’키의 값을 사용할 데이터베이스의 이름으로 지정
ex)


ii.    anaconda prompt에서 프로젝트의 경로로 접근

    => ‘python manage.py inspectdb > 생성할 폴더명.py’ 명령어로 실행: 프로젝트에 기존 테이블들의 구조 코드 가진 파일을 만드는 것


ex) python manage.py inspectdb > abc.py : test
라는 데이터베이스에 저장되어 있는 모든 테이블들을 ORM 기반의 코드가 입력된 abc.py파일이 생성


iv.   필요한 테이블 클래스를 model.py에 복사해 놓고 꼭 abc.py는 삭제 해야함

v.    프로젝트명 우 클릭 -> Django -> Make Migrate(Django >= 1.7) 클릭 후 app 이름 기입

vi.   3rd. 프로젝트명 우 클릭 -> Django -> Migrate(Django >= 1.7)

 

8)         변수의 타입은 장고에서 미리 정해 둔 필드 클래스 사용 = ORM기법 변수타입 지정 메소드

 

[참고]velog.io/@bungouk6829/Django-%EB%AA%A8%EB%8D%B8%EC%9D%98-%ED%95%84%EB%93%9C-%EA%B4%80%EA%B3%84%ED%98%95-%ED%95%84%EB%93%9C

 

        AutoField

i.     자동 id컬럼 대신 사용자가 생성

ii.    형식: models.AutoField(auto_created = True, primary_key = True)

        CharField

i.     mariadb varchar

ii.    형식: models.CharField(max_length=n)

iii.   max_length는 최대 허용 자리 수

        TextField

i.     글자 수 제한 없는 mariadb varchar

ii.    형식: models.TextField()

        DateTimeField

i.     날짜, 시간 타입 지정, mariadb date

ii.    형식: models.DateTimeField()

        IntegerField

i.     mariadb int

ii.    형식: models. IntegerField()

 

from django.db import models

# Create your models here.
#논리적인 테이블을 설정

class Article(models.Model): #models의 model을 상속받음
    code = models.CharField(max_length=10) 
    #CharField: varchar라고 생각, create table 컬럼 만드는 것, max_length: 10자리 글자
    name = models.CharField(max_length=20)
    content = models.TextField() # models.TextField: 글자 수 제한 없음
    price = models.IntegerField()
    pub_date = models.DateTimeField() #등록일

 

        ForeignKey

i.     형식: models.ForeignKey(primary key클래스명, [on_delete = models.CASCADE])

ii.    foreign key 설정

iii.   primary key클래스명만 명시하면 자동으로 primary key 찾아서 설정

iv.   물리적 이름 = 논리적 이름_해당primary key이름

from django.db import models
# Create your models here.

class Maker(models.Model):
    mname = models.CharField(max_length = 10)
    tel = models.CharField(max_length = 20)
    addr = models.CharField(max_length = 50)

class Product(models.Model):
    pname = models.CharField(max_length = 10)
    price = models.IntegerField()
    maker_name = models.ForeignKey(Maker, on_delete = models.CASCADE)
    #Maker의 primarykey인 id를 참조하게 됨. 

 

9)         __str__() 메서드

        해당 클래스로 만들어진 인스턴트를 자체를 출력할 때, 문자열로 설명해주기 위한 메서드

        Django models.py에서는 class admin 페이지에서 어떻게 출력되는지 정의해주는 역할

        테이블 조인 시 primary key가 포함된 부모테이블에서 추출할 컬럼을 문자열로 반환해주는 역할

        재정의 대상

        디버깅에 도움

 

<__str__ 정의>

from django.db import models
#장고의 철학: db가 바뀌어도 소스코드는 안바뀌게 
# Create your models here.
class Maker(models.Model):
    mname = models.CharField(max_length = 10)
    tel = models.CharField(max_length = 20)
    addr = models.CharField(max_length = 50)
    
    class Meta:
        ordering = ('-id', )
    
    def __str__(self):
       return self.mname
    #편리함위해 - foreignkey 설정할 때 web에서 primary key의 mname으로 보여주게됨. but db에는 id로 저장됨
    #아니면 primary key 그대로 1번 2번 이렇게 보임. 
    
class Product(models.Model):
    pname = models.CharField(max_length = 10)
    price = models.IntegerField()
    maker_name = models.ForeignKey(Maker, on_delete = models.CASCADE)
    #Maker의 primarykey인 id를 참조하게 됨. ​

<__str__ 미정의>

from django.db import models
#장고의 철학: db가 바뀌어도 소스코드는 안바뀌게 
# Create your models here.
class Maker(models.Model):
    mname = models.CharField(max_length = 10)
    tel = models.CharField(max_length = 20)
    addr = models.CharField(max_length = 50)
    
    class Meta:
        ordering = ('-id', )
    
class Product(models.Model):
    pname = models.CharField(max_length = 10)
    price = models.IntegerField()
    maker_name = models.ForeignKey(Maker, on_delete = models.CASCADE)
    #Maker의 primarykey인 id를 참조하게 됨. ​​

[참고] 7. Django: ORM-Method, __str__() :: ComDoc (tistory.com)

 

10)       Meta클래스 생성: 정렬(sort)처리

        ordering변수에 튜플 형태로 정렬 기준을 지정

        - 붙이면 내림차순, 기본은 오름차순

 

from django.db import models

class Guest(models.Model):
    #no = models.AutoField(auto_created = True, primary_key = True) #자동 id컬럼 대신 사용자가 생성 가능, 따로 정의 안하면 자동으로 id생성됨
    title = models.CharField(max_length = 50)
    content = models.TextField()
    regdate = models.DateTimeField()
    
    def __str__(self):
        return self.title
    
    #테이블을 만들 때 sort지정
    class Meta:
        ordering = ('-title','id') #타이틀별로 내림차순, 타이틀 같으면 id로 오름차순 => 튜플형태로
        ordering = ('-id',)​

 

 

'Django' 카테고리의 다른 글

3. MVT방식 - (3) Template  (0) 2021.05.11
3. MVT방식 - (2) view  (0) 2021.05.11
2. 프로젝트 설정 - (4) DB 생성  (0) 2021.05.11
2. 프로젝트 설정 - (3) urls.py  (0) 2021.05.11
2. 프로젝트 설정 - (2) settings.py  (0) 2021.05.11

관련글 더보기