"1. 장고 모델 개요 & 모델정의"의 두 판 사이의 차이

잔글 (Sam님이 1. 장고 모델 개요 문서를 1. 장고 모델 개요 & 모델정의 문서로 이동했습니다)
 
(사용자 2명의 중간 판 9개는 보이지 않습니다)
2번째 줄: 2번째 줄:
  
 
==개요==
 
==개요==
 +
데이터베이스에 저장되는 테이블을 정의하는 클래스.
 +
 
데이터베이스에 데이터를 저장하고 조작하려면 SQL이 필요하지만, 그 도움 없이 파이썬 문법만으로 데이터를 처리할 수 있게 하는 도구.
 
데이터베이스에 데이터를 저장하고 조작하려면 SQL이 필요하지만, 그 도움 없이 파이썬 문법만으로 데이터를 처리할 수 있게 하는 도구.
  
35번째 줄: 37번째 줄:
  
 
애플리케이션 디렉토리의 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>일반적으로 클래스의 이름은 대문자로 시작하게끔 지어준다.
 +
 
 
===DB반영===
 
===DB반영===
 
모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다.
 
모델에 메서드가 추가되기만 했을 땐 실행할 필요 없다.
54번째 줄: 59번째 줄:
 
|}
 
|}
  
== 관리자페이지 ==
+
= 관리자페이지 =
 +
모델을 바로 뷰에 연결해 활용하기엔 어려움이 있다. 때문에, 관리자페이지에서 모델의 형태가 어떠한지 파악하고 다음 단계로 진행하는 것이 일반적이다.
 +
 
 +
===관리자페이지 등록===
 +
{| class="wikitable"
 +
!과정
 +
!설명
 +
|-
 +
|등록
 +
|테이블을 만들었다고 해서 admin페이지에 테이블이 바로 보이는 것은 아니다.
 +
admin.py에 추가.<syntaxhighlight lang="python">
 +
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"
|+
 
 
!
 
!
 
!설명
 
!설명
63번째 줄: 93번째 줄:
 
|__str__
 
|__str__
 
|모델클래스 안에 정의한다.
 
|모델클래스 안에 정의한다.
기본적으로 오브젝트를 보면 id가 나오는데, 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다.
+
 
 +
 
 +
 
  
 
객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다.
 
객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다.
 +
 +
(이게 없으면 무슨 모델의 몇번째 객체라고만 떠서 구분하기가 어렵다.)
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
def __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>으로 지정해주면 된다.
  
 
[[분류:장고 모델]]
 
[[분류:장고 모델]]

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.py에 추가한다.
@admin.register(모델)
class ModelNameAdmin(admin.ModelAdmin):  # 일반적으로 모델명Admin 형태로 클래스명을 짓는다.
    list_display = ['칼럼', '칼럼2']  # 함께 보고 싶은 칼럼을 넣어준다.
형태로 admin.py를 수정해주어야 한다.

3.2 오브젝트 이름 설정하기편집

기본적으로 오브젝트를 보면 id로 표시되는데, 이것만으론 어떤 오브젝트인지 구분하기가 쉽지 않다. 이 id 대신 다른 것으로 표현하고 싶을 때 사용한다.

설명 형태
__str__ 모델클래스 안에 정의한다.



객체를 문자열로 표현하기 위한 함수로, Admin페이지 등에서 객체를 보여주기 위해 쓰인다.

(이게 없으면 무슨 모델의 몇번째 객체라고만 떠서 구분하기가 어렵다.)

def __str__(self):
    return self.subject  # 모델의 속성 중 subject를 반환하여 보여준다.
제목이 아니라 여러 내용들을 조합하고 싶다면 다음과 같이 쓴다.
def __str__(self):
    return f'제목:{self.subject}, 좋아요:{self.likeCount}, 날짜:{self.date}'

4 모델 변경편집

웹사이트를 서비스하는 중에도 모델의 형태를 바꿔야 할 때가 있다.

4.1 방법편집

단순히 모델에 변형을 가한 이후 makemigrationsmigrate를 통해 DB를 변경해주어야 한다.

null=False 옵션을 사용한 경우, 이전에 입력됬던 값들을 어떻게 처리할지 묻는데, 묻는 말에 따라 해당 데이터를 기입하면 된다.(일반적으로 이전 데이터는 한가지 옵션으로 다 채운다.)

4.2 수정하기편집

과정 설명
DB 수정
  • 새로운 테이블명이 생긴 경우, python manage.py makemigrations을 기입해주고,
  • 단순 변형이 가해진 경우 python manage.py migrate를 해준다.

5 관련에러편집

5.1 No changes detected편집

python manage.py makemigrations를 수행했을 때 발생하는 에러. 다음과 같은 2가지 해결책이 있다.

  1. settings.py에 해당 app을 등록하지 않은 경우. INSTALLED_APPS에 해당 앱을 등록한다.
  2. 원인 불명.(아마 서버에서 모델 없이 사용하다가 뒤늦게 등록할 때 발생하는듯.) 앱이 제대로 등록되어 있음에도 안되는 경우. 그럴 땐 python manage.py makemigrations 앱이름으로 지정해주면 된다.