1번째 줄: |
1번째 줄: |
| + | <youtube>https://www.youtube.com/watch?v=Y8RiZjAMQ-s</youtube> |
| | | |
| ==개요== | | ==개요== |
| + | 데이터베이스에 저장되는 테이블을 정의하는 클래스. |
| + | |
| 데이터베이스에 데이터를 저장하고 조작하려면 SQL이 필요하지만, 그 도움 없이 파이썬 문법만으로 데이터를 처리할 수 있게 하는 도구. | | 데이터베이스에 데이터를 저장하고 조작하려면 SQL이 필요하지만, 그 도움 없이 파이썬 문법만으로 데이터를 처리할 수 있게 하는 도구. |
| | | |
8번째 줄: |
11번째 줄: |
| ===특징=== | | ===특징=== |
| 하나의 모델은 하나의 테이블에 매핑된다. 모델의 속성은 컬럼에 매핑된다. 모델을 정의하면 primarykey는 장고에서 자동으로 부여한다.(직접 지정할 수도 있다.) | | 하나의 모델은 하나의 테이블에 매핑된다. 모델의 속성은 컬럼에 매핑된다. 모델을 정의하면 primarykey는 장고에서 자동으로 부여한다.(직접 지정할 수도 있다.) |
− | ==테이블 설계하기== | + | ===테이블 설계하기=== |
| 장고의 모델은 하나의 테이블에 매핑된다. 때문에 테이블을 어떤 방식으로 관리할지 청사진이 그려져야 한다. | | 장고의 모델은 하나의 테이블에 매핑된다. 때문에 테이블을 어떤 방식으로 관리할지 청사진이 그려져야 한다. |
| | | |
− | 컬럼명, 타입, 제약조건 등에 따라 테이블을 설계한다. | + | 컬럼명, 타입, 제약조건 등에 따라 테이블을 설계한 후 모델을 정의하는 게 일반적이다. |
| {| class="wikitable" | | {| class="wikitable" |
| !컬럼명 | | !컬럼명 |
31번째 줄: |
34번째 줄: |
| |용도 설명 | | |용도 설명 |
| |} | | |} |
− | ==정의==
| + | =정의= |
| + | |
| 애플리케이션 디렉토리의 model.py에서 정의한다.<syntaxhighlight lang="python"> | | 애플리케이션 디렉토리의 model.py에서 정의한다.<syntaxhighlight lang="python"> |
− | class 모델명(models.Model): #이게 하나의 테이블이 된다. | + | from django.db import models |
| + | |
| + | class 모델명(models.Model): # 이게 하나의 테이블이 된다. |
| 속성 = model.옵션(옵션) | | 속성 = model.옵션(옵션) |
− | </syntaxhighlight> | + | </syntaxhighlight>일반적으로 클래스의 이름은 대문자로 시작하게끔 지어준다. |
− | ===테이블 디자인하기===
| |
− | {| class="wikitable"
| |
− | |+
| |
− | !컬럼명
| |
− | !타입
| |
− | !제약조건
| |
− | !설명
| |
− | |-
| |
− | |이름
| |
− | |integer
| |
− | varchar
| |
| | | |
− | datetime
| + | ===DB반영=== |
− | |NotNull
| |
− | Autoincrement(자동증가속성)
| |
− | | |
− | PK(primary key)
| |
− | | |
− | FK(foreign key)
| |
− | |용도 설명
| |
− | |}
| |
− | | |
− | === DB반영 === | |
| 모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다. | | 모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다. |
| {| class="wikitable" | | {| class="wikitable" |
74번째 줄: |
59번째 줄: |
| |} | | |} |
| | | |
− | == 모델 변경 == | + | = 관리자페이지 = |
− | 웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다.
| + | 모델을 바로 뷰에 연결해 활용하기엔 어려움이 있다. 때문에, 관리자페이지에서 모델의 형태가 어떠한지 파악하고 다음 단계로 진행하는 것이 일반적이다. |
| | | |
− | === 방법 === | + | ===관리자페이지 등록=== |
− | 단순히 모델에 변형을 가한 이후 <code>makemigrations</code>과 <code>migrate</code>를 통해 DB를 변경해주어야 한다.
| |
− | | |
− | null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.)
| |
− | | |
− | === 수정하기 ===
| |
| {| class="wikitable" | | {| class="wikitable" |
| !과정 | | !과정 |
| !설명 | | !설명 |
| |- | | |- |
− | |DB 수정 | + | |등록 |
− | | | + | |테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다. |
− | *새로운 테이블명이 생긴 경우, python manage.py makemigration을 기입해주고,
| + | admin.py에 추가.<syntaxhighlight lang="python"> |
− | *단순 변형이 가해진 경우 python manage.py migrate를 해준다.
| + | from 어플명.models import 테이블1, 테이블2, .. |
| + | |
| + | admin.site.register(테이블1) |
| + | </syntaxhighlight>형태로 admin.py를 수정해주어야 한다. |
| |- | | |- |
− | | | + | |여러 칼럼으로 보고 싶을 때 |
− | | | + | |단순히 제목만 보는 게 아니라 여러 항목들을 표 형태로 보고 싶을 때. |
| + | admin.py에 추가한다.<syntaxhighlight lang="python"> |
| + | @admin.register(모델) |
| + | class ModelNameAdmin(admin.ModelAdmin): # 일반적으로 모델명Admin 형태로 클래스명을 짓는다. |
| + | list_display = ['칼럼', '칼럼2'] # 함께 보고 싶은 칼럼을 넣어준다. |
| + | </syntaxhighlight>형태로 admin.py를 수정해주어야 한다. |
| |} | | |} |
| | | |
− | ==관리자페이지== | + | === 오브젝트 이름 설정하기 === |
| + | 기본적으로 오브젝트를 보면 id로 표시되는데, 이것만으론 어떤 오브젝트인지 구분하기가 쉽지 않다. 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다. |
| {| class="wikitable" | | {| class="wikitable" |
− | |+
| |
| ! | | ! |
| !설명 | | !설명 |
105번째 줄: |
93번째 줄: |
| |__str__ | | |__str__ |
| |모델클래스 안에 정의한다. | | |모델클래스 안에 정의한다. |
− | 기본적으로 오브젝트를 보면 id가 나오는데, 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다.
| + | |
| + | |
| + | |
| | | |
| 객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다. | | 객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다. |
| + | |
| + | (이게 없으면 무슨 모델의 몇번째 객체라고만 떠서 구분하기가 어렵다.) |
| |<syntaxhighlight lang="python"> | | |<syntaxhighlight lang="python"> |
− | del __str__(self):
| + | def __str__(self): |
− | return self.subject # 객체의 속성 중 subject를 반환하여 보여준다. | + | return self.subject # 모델의 속성 중 subject를 반환하여 보여준다. |
| </syntaxhighlight> | | </syntaxhighlight> |
| |- | | |- |
| | | | | |
− | | | + | |제목이 아니라 여러 내용들을 조합하고 싶다면 다음과 같이 쓴다. |
− | | | + | |<syntaxhighlight lang="python"> |
− | |-
| + | def __str__(self): |
− | |
| + | return f'제목:{self.subject}, 좋아요:{self.likeCount}, 날짜:{self.date}' |
− | |
| + | </syntaxhighlight> |
− | |
| |
| |} | | |} |
− | ===관리자페이지 등록=== | + | |
| + | =모델 변경= |
| + | 웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다. |
| + | ===방법=== |
| + | 단순히 모델에 변형을 가한 이후 <code>makemigrations</code>과 <code>migrate</code>를 통해 DB를 변경해주어야 한다. |
| + | |
| + | null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.) |
| + | ===수정하기=== |
| {| class="wikitable" | | {| class="wikitable" |
| !과정 | | !과정 |
| !설명 | | !설명 |
| |- | | |- |
− | |admin.py 수정 | + | |DB 수정 |
− | |테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다. admin.py에서<syntaxhighlight lang="python"> | + | | |
− | from 어플명.models import 테이블1, 테이블2, ..
| + | *새로운 테이블명이 생긴 경우, python manage.py makemigrations을 기입해주고, |
− | | + | *단순 변형이 가해진 경우 python manage.py migrate를 해준다. |
− | admin.site.register(테이블1)
| |
− | </syntaxhighlight>형태로 admin.py를 수정해주어야 한다.
| |
| |} | | |} |
| | | |
− | ==외부 모델과 연결== | + | = 관련에러 = |
− | 외부모델을 연결한다든가 다양한 상황이 생길 수 있다. 이때 외부모델을 임포트해와야 하는데, 다음과 같은 형식으로 불러온다.
| |
− | | |
− | from 앱이름.models import 모델명
| |
− | | |
− | 위 형식으로 임포트 해서 사용할 수 있다.
| |
− | {| class="wikitable"
| |
− | !
| |
− | !
| |
− | !
| |
− | |-
| |
− | |댓글달기
| |
− | |댓글을 다는 기능을 구현하기 위해 댓글 테이블을 만들려면 기존 글에 대한 ForeignKey를 사용해야 한다.
| |
− | on_delete-models.CASCADE 옵션은 기존 글이 사라질때 같이 사라지게 한다는 의미이다.
| |
− | |<syntaxhighlight lang="python">
| |
− | class 댓글(models.Model):
| |
− | 기존글 = models.ForeignKey(기존모델, on_delete-models.CASCADE)
| |
− | </syntaxhighlight>
| |
− | |}
| |
| | | |
| + | === No changes detected === |
| + | <code>python manage.py makemigrations</code>를 수행했을 때 발생하는 에러. 다음과 같은 2가지 해결책이 있다. |
| | | |
− | ==tip.==
| + | # settings.py에 해당 app을 등록하지 않은 경우. INSTALLED_APPS에 해당 앱을 등록한다. |
| + | # 원인 불명.(아마 서버에서 모델 없이 사용하다가 뒤늦게 등록할 때 발생하는듯.) 앱이 제대로 등록되어 있음에도 안되는 경우. 그럴 땐 <code>python manage.py makemigrations 앱이름</code>으로 지정해주면 된다. |
| | | |
| [[분류:장고 모델]] | | [[분류:장고 모델]] |