상세 컨텐츠

본문 제목

[Django] 모델(Model)

Python/Django

by TUZA 2022. 9. 15. 16:25

본문

장고는 모델(Model) 을 이용하여 데이터베이스를 처리한다. 보통 데이터베이스에 데이터를 저장하고 조회하기 위해서 SQL 쿼리문을 이용해야 하지만 장고의 모델(Model) 을 사용하면 이런 SQL 쿼리문의 도움없이 쉽게 처리할 수 있다.

 

#장고 앱 migrate

# python manage.py runserver 시 다음과 같은 문구를 확인할 수 있다.
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.


# 위에서 말한대로 python manage.py migrate 명령을 수행해보자.
python manage.py migrate

# 위 명령어를 실행하면 migrate 가 수행된다.
# 이로 인해 admin, auth, contenttypes,sessions 앱들이 사용하는 테이블들이 생성된다.
# 어떤 테이블들이 생성되는 지 알 필요는 없다.

#모델 작성하기

1) 모델 속성

Question 모델

Question 모델 속성

Answer 모델

Answer 모델 속성

 

#models.py

from django.db import models

# Create your models here.

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()



class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()

- Answer 모델은 질문에 대한 답변에 해당되므로 Question 모델을 속성으로 가져가야한다.
- 기존 모델을 속성으로 연결하려면 ForeignKey 를 사용해야한다.
- ForeignKey 는 다른 모델과 연결하기 위해 사용한다.
- on_delete = models.CASCADE 의 의미는 이 답변과 연결된 질문(Question) 이 삭제될 경우 답변(Answer) 도 함께 삭제된다는 의미이다. 즉, CASCADE 옵션은 질문을 삭제하면 그에 달린 답변들도 모두 함께 삭제한다.

 

#테이블 생성하기

테이블을 생성하기 위해 가장 먼저 해야할 일은 pybo 앱을 config/settings.py 파일의 INSTALLED_APPS 항목에 추가하는 것이다.

(... 생략 ...)
INSTALLED_APPS = [
    'pybo.apps.PyboConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    (... 생략 ...)
]
(... 생략 ...)


#pybo.apps.PyboConfig 클래스는 pybo/apps.py 파일에 있는 클래스이다.
#pybo/apps.py
from django.apps import AppConfig


class PyboConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'pybo'

 

#makemigrations

테이블을 생성하기 위해 migrate 명령을 수행해보자.

모델이 신규로 생성되거나 변경되면 mkaemigrations 명령을 먼저 수행한 후에 migrate 명령을 수행해야한다.

#python manage.py makemigrations

#makemigrations 명령은 모델을 생성하거나 모델에 변화가 있을 경우 실행해야 하는 명령이다.

#sqlmigrate

makemigrations 로 데이터베이스 작업 파일을 생성하고 migrate 명령을 실행하기 전에 실제 어떤 쿼리문이 실행되는 지 sqlmigrate 명령으로 확인해 볼 수 있다.

sqlmigrate 명령은 단지 실행되는 쿼리만 조회할 뿐이다. 실제 쿼리가 수행되지는 않는다.

python [manage.py](http://manage.py/) sqlmigrate pybo 0001 
#“pybo” 는 앱 이름을 의미하고, “0001” 은 생성된 작업파일(0001_inital.py) 의 일련번호를 의미한다.

#migrate

migrate 명령을 수행하여 실제 테이블을 생성.

python manage.py migrate

 

#모델 사용하기

장고 셀을 이용하여 모델을 사용해보자.

#python manage.py shell

>>> from pybo.models import Question, Answer
>>> from django.utils import timezone
>>> q = Question(subject='pybo가 무엇인가요?', content='pybo에 대해서 알고 싶습니다.', create_date=timezone.now())
>>> q.save()
>>>1

#Question 조회

>>>Question.objects 를 통해서 조회할 수 있다.

Question.objects.all() 은 모든 Question 데이터를 조회하는 함수이다.

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()

    def __str__(self):
        return self.subject


#class에 __str__ 메서드를 추가하면 id 값 대신 제목을 표시할 수 있다.
<QuerySet [<Question: pybo가 무엇인가요?>, <Question: 장고 모델질문입니다.>, <Question: pybo가 무엇인가요?>]>


#filter 사용
#조건에 해당하는 데이터는 모두 리턴해줌
Question.objects.filter(id=1)

#Question.objects.get(id=1)
#조건에 맞는 데이터 한 건만 리턴해줌

#문자열이 포함된 데이터만 조회하는 방법
>>> Question.objects.filter(subject__contains='장고')

#질문을 이용하여 답변을 찾는 방법

>>>q.answer_set.all()

q.answer_set 을 사용하면 질문에 연결된 답변을 가져올 수 있다. Question 모델에는 answer_set 이라는 속성이 없지만 Answer 모델에 Question 모델이 ForignKey 로 연결되어 있기 때문에 q.answer_set 과 같은 역방향 접근이 가능하다.

단, answer_set 의 경우 여러 개의 답변이 있는 경우에만 사용할 수 있으며, 답변이 하나도 없는 경우는 a.question 을 사용해야한다.

 

📖 참고 자료

#SQLite

주로 개발용이나 소규모 프로젝트에서 사용되는 가벼운 파일 기반의 데이터베이스이다.

 

#ORM(Object Relational Mapping)

데이터베이스의 테이블을 모델화하여 사용하기 때문에 위에서 열거한 SQL 방식의 단점이 모두 없어진다. ORM 을 사용하면 개발자별로 독특한 쿼리문이 만들어질 수 없고, 또 쿼리를 잘못 작성할 가능성도 줄어든다. 그리고 데이터베이스 종류가 볍ㄴ경되더라도 쿼리문이 아닌 모델을 사용하기 때문에 프로그램을 수정할 필요가 없다.

**전통방식

  • 개발자마다 다양한 쿼리문이 만들어짐
  • 잘못 작성된 쿼리는 시스템의 성능을 저하시킴
  • MySQL 에서 오라클로 변경하면 프로그램에서 사용한 쿼리문을 모두 해당 데이터베이스의 규칙에 맞게 수정해야한다.

#장고 공식문서

https://docs.djangoproject.com/en/4.0/ref/models/fields/#field-types

반응형

관련글 더보기