"1. 장고 모델 개요 & 모델정의"의 두 판 사이의 차이
(→DB반영) |
(→모델 변경) |
||
(사용자 3명의 중간 판 16개는 보이지 않습니다) | |||
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"> | ||
− | + | from django.db import models | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | class 모델명(models.Model): # 이게 하나의 테이블이 된다. | |
− | + | 속성 = model.옵션(옵션) | |
− | + | </syntaxhighlight>일반적으로 클래스의 이름은 대문자로 시작하게끔 지어준다. | |
− | + | ===DB반영=== | |
− | + | 모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다. | |
− | |||
− | |||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
− | + | !과정 | |
− | + | !방법 | |
− | ! | + | !비고 |
− | ! | ||
− | ! | ||
|- | |- | ||
− | | | + | |DB변경사항 반영 |
− | | | + | |python manage.py makemigrations |
− | | | + | |새로운 테이블이 생긴 경우. DB 자체에 변형이 가해진다. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
− | | | + | |DB생성 |
− | | | + | |python manage.py migrate |
− | | | + | |속성이 변한 경우. DB에 변경사항을 반영하라는 명령이다. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
+ | |||
+ | = 관리자페이지 = | ||
+ | 모델을 바로 뷰에 연결해 활용하기엔 어려움이 있다. 때문에, 관리자페이지에서 모델의 형태가 어떠한지 파악하고 다음 단계로 진행하는 것이 일반적이다. | ||
+ | |||
===관리자페이지 등록=== | ===관리자페이지 등록=== | ||
{| class="wikitable" | {| class="wikitable" | ||
89번째 줄: | 67번째 줄: | ||
!설명 | !설명 | ||
|- | |- | ||
− | | | + | |등록 |
− | |테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다. admin. | + | |테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다. |
+ | admin.py에 추가.<syntaxhighlight lang="python"> | ||
from 어플명.models import 테이블1, 테이블2, .. | from 어플명.models import 테이블1, 테이블2, .. | ||
admin.site.register(테이블1) | 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를 수정해주어야 한다. | </syntaxhighlight>형태로 admin.py를 수정해주어야 한다. | ||
|} | |} | ||
− | == | + | |
− | + | === 오브젝트 이름 설정하기 === | |
+ | 기본적으로 오브젝트를 보면 id로 표시되는데, 이것만으론 어떤 오브젝트인지 구분하기가 쉽지 않다. 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다. | ||
{| class="wikitable" | {| class="wikitable" | ||
− | ! | + | ! |
− | ! | + | !설명 |
− | ! | + | !형태 |
|- | |- | ||
− | | | + | |__str__ |
− | | | + | |모델클래스 안에 정의한다. |
− | | | + | |
+ | |||
+ | |||
+ | |||
+ | 객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다. | ||
+ | |||
+ | (이게 없으면 무슨 모델의 몇번째 객체라고만 떠서 구분하기가 어렵다.) | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | def __str__(self): | ||
+ | return self.subject # 모델의 속성 중 subject를 반환하여 보여준다. | ||
+ | </syntaxhighlight> | ||
|- | |- | ||
− | | | + | | |
− | | | + | |제목이 아니라 여러 내용들을 조합하고 싶다면 다음과 같이 쓴다. |
− | | | + | |<syntaxhighlight lang="python"> |
+ | def __str__(self): | ||
+ | return f'제목:{self.subject}, 좋아요:{self.likeCount}, 날짜:{self.date}' | ||
+ | </syntaxhighlight> | ||
|} | |} | ||
− | + | =모델 변경= | |
웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다. | 웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다. | ||
− | + | ===방법=== | |
− | === 방법 === | ||
단순히 모델에 변형을 가한 이후 <code>makemigrations</code>과 <code>migrate</code>를 통해 DB를 변경해주어야 한다. | 단순히 모델에 변형을 가한 이후 <code>makemigrations</code>과 <code>migrate</code>를 통해 DB를 변경해주어야 한다. | ||
null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.) | null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.) | ||
− | + | ===수정하기=== | |
− | === 수정하기 === | ||
{| class="wikitable" | {| class="wikitable" | ||
!과정 | !과정 | ||
127번째 줄: | 126번째 줄: | ||
|DB 수정 | |DB 수정 | ||
| | | | ||
− | *새로운 테이블명이 생긴 경우, python manage.py | + | *새로운 테이블명이 생긴 경우, python manage.py makemigrations을 기입해주고, |
*단순 변형이 가해진 경우 python manage.py migrate를 해준다. | *단순 변형이 가해진 경우 python manage.py migrate를 해준다. | ||
− | |||
− | |||
− | |||
|} | |} | ||
− | == | + | = 관련에러 = |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | === No changes detected === | ||
+ | <code>python manage.py makemigrations</code>를 수행했을 때 발생하는 에러. 다음과 같은 2가지 해결책이 있다. | ||
− | + | # settings.py에 해당 app을 등록하지 않은 경우. INSTALLED_APPS에 해당 앱을 등록한다. | |
+ | # 원인 불명.(아마 서버에서 모델 없이 사용하다가 뒤늦게 등록할 때 발생하는듯.) 앱이 제대로 등록되어 있음에도 안되는 경우. 그럴 땐 <code>python manage.py makemigrations 앱이름</code>으로 지정해주면 된다. | ||
[[분류:장고 모델]] | [[분류:장고 모델]] |
2023년 1월 13일 (금) 12:42 기준 최신판
1 개요[편집 | 원본 편집]
데이터베이스에 저장되는 테이블을 정의하는 클래스.
데이터베이스에 데이터를 저장하고 조작하려면 SQL이 필요하지만, 그 도움 없이 파이썬 문법만으로 데이터를 처리할 수 있게 하는 도구.
테이블과 컬럼을 만들고 컬럼의 제약조건까지 결정한다.
1.1 ORM(Object Relation Mapping)[편집 | 원본 편집]
객체관계매핑. DB와 모델을 연결시켜 SQL을 사용하지 않고도 테이블을 조작한다.
1.2 특징[편집 | 원본 편집]
하나의 모델은 하나의 테이블에 매핑된다. 모델의 속성은 컬럼에 매핑된다. 모델을 정의하면 primarykey는 장고에서 자동으로 부여한다.(직접 지정할 수도 있다.)
1.3 테이블 설계하기[편집 | 원본 편집]
장고의 모델은 하나의 테이블에 매핑된다. 때문에 테이블을 어떤 방식으로 관리할지 청사진이 그려져야 한다.
컬럼명, 타입, 제약조건 등에 따라 테이블을 설계한 후 모델을 정의하는 게 일반적이다.
컬럼명 | 타입 | 제약조건 | 설명 |
---|---|---|---|
이름 | integer
varchar datetime |
NotNull
Autoincrement(자동증가속성) PK(primary key) FK(foreign key) |
용도 설명 |
2 정의[편집 | 원본 편집]
애플리케이션 디렉토리의 model.py에서 정의한다.
from django.db import models
class 모델명(models.Model): # 이게 하나의 테이블이 된다.
속성 = model.옵션(옵션)
일반적으로 클래스의 이름은 대문자로 시작하게끔 지어준다.
2.1 DB반영[편집 | 원본 편집]
모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다.
과정 | 방법 | 비고 |
---|---|---|
DB변경사항 반영 | python manage.py makemigrations | 새로운 테이블이 생긴 경우. DB 자체에 변형이 가해진다. |
DB생성 | python manage.py migrate | 속성이 변한 경우. DB에 변경사항을 반영하라는 명령이다. |
3 관리자페이지[편집 | 원본 편집]
모델을 바로 뷰에 연결해 활용하기엔 어려움이 있다. 때문에, 관리자페이지에서 모델의 형태가 어떠한지 파악하고 다음 단계로 진행하는 것이 일반적이다.
3.1 관리자페이지 등록[편집 | 원본 편집]
과정 | 설명 |
---|---|
등록 | 테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다.
admin.py에 추가.from 어플명.models import 테이블1, 테이블2, ..
admin.site.register(테이블1)
|
여러 칼럼으로 보고 싶을 때 | 단순히 제목만 보는 게 아니라 여러 항목들을 표 형태로 보고 싶을 때.
admin.py에 추가한다.@admin.register(모델)
class ModelNameAdmin(admin.ModelAdmin): # 일반적으로 모델명Admin 형태로 클래스명을 짓는다.
list_display = ['칼럼', '칼럼2'] # 함께 보고 싶은 칼럼을 넣어준다.
|
3.2 오브젝트 이름 설정하기[편집 | 원본 편집]
기본적으로 오브젝트를 보면 id로 표시되는데, 이것만으론 어떤 오브젝트인지 구분하기가 쉽지 않다. 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다.
설명 | 형태 | |
---|---|---|
__str__ | 모델클래스 안에 정의한다.
(이게 없으면 무슨 모델의 몇번째 객체라고만 떠서 구분하기가 어렵다.) |
def __str__(self):
return self.subject # 모델의 속성 중 subject를 반환하여 보여준다.
|
제목이 아니라 여러 내용들을 조합하고 싶다면 다음과 같이 쓴다. | def __str__(self):
return f'제목:{self.subject}, 좋아요:{self.likeCount}, 날짜:{self.date}'
|
4 모델 변경[편집 | 원본 편집]
웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다.
4.1 방법[편집 | 원본 편집]
단순히 모델에 변형을 가한 이후 makemigrations
과 migrate
를 통해 DB를 변경해주어야 한다.
null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.)
4.2 수정하기[편집 | 원본 편집]
과정 | 설명 |
---|---|
DB 수정 |
|
5 관련에러[편집 | 원본 편집]
5.1 No changes detected[편집 | 원본 편집]
python manage.py makemigrations
를 수행했을 때 발생하는 에러. 다음과 같은 2가지 해결책이 있다.
- settings.py에 해당 app을 등록하지 않은 경우. INSTALLED_APPS에 해당 앱을 등록한다.
- 원인 불명.(아마 서버에서 모델 없이 사용하다가 뒤늦게 등록할 때 발생하는듯.) 앱이 제대로 등록되어 있음에도 안되는 경우. 그럴 땐
python manage.py makemigrations 앱이름
으로 지정해주면 된다.