바뀜

1,866 바이트 추가됨 ,  2023년 1월 13일 (금) 12:42
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>으로 지정해주면 된다.
    
[[분류:장고 모델]]
 
[[분류:장고 모델]]