관리 메뉴

프로그래밍

[Django] 장고 Model 사용(생성, 조회, 수정, 삭제, 작성) 본문

Python/Django

[Django] 장고 Model 사용(생성, 조회, 수정, 삭제, 작성)

시케 2023. 11. 27. 11:06
728x90
반응형

2023.11.27.월

장고 Model 사용

본격적으로 장고 Model을 활용하여 DB를 다루어보자

장고에서 기본적인 데이터베이스 관련 설정은 위와 같으며 settings.py 에 위치한다

 

모델 작성

다음과 같은 형식의 모델을 작성해보자

 

[Question]

속성 설명
subject 질문의 제목
content 질문의 내용
create_date 질문을 작성한 일시

 

[Answer]

속성 설명
question 질문(어떤 질문의 답변인지)
content 답변의 내용
create_date 답변을 작성한 일시

 

models.py

from django.db import models


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()

 

테이블 생성

 

먼저 해당 앱을 settings.py에 추가하여 파일의 INSTALLED_APPS 항목에 추가한다

'app01' 어플리케이션의 apps.py에 App01Config 클래스로 구현되어 있는데

해당 name을 작성하면 된다

python manage.py makemigrations
python manage.py migrate

:: migrate 명령을 실행하기 전에 실제 어떤 쿼리문이 실행되는지 확인 가능
python manage.py sqlmigrate app01 0001

 

마이그레이션 생성 및 적용하면 테이블이 생성된다

 

모델 사용

Question 생성

모델 사용을 장고 Shell을 활용하여 해보자

:: 장고 shell 실행
python manage.py shell

 

>>> from app01.models import Question, Answer

Question, Answer 모델 import

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

질문 데이터 입력

>>> q.id
1

질문 데이터 1건인 것을 볼 수 있다

 

Question 조회

모델 사용을 장고 Shell을 활용하여 해보자

>>> Question.objects.all()

Question 모델 데이터의 모든 데이터 조회

결과값으로는 QuerySet 객체가 리턴되는데 위처럼 Question 객체를 포함하고 있다

Question object (1), Question object (2) 에서 1과 2는 Question 데이터의 id 값이다

 

다음처럼 Question 모델에 __str__ 메서드를 추가하면 id 값 대신 제목을 표시할 수 있다

app01.models.py

from django.db import models


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

    def __str__(self):
        return self.subject


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

 

>>> Question.objects.filter(id=1)
>>> Question.objects.get(id=1)

 

fillter를 사용하면 조건에 해당하는 데이터를 모두 리턴해준다

따라서 다건을 의미하는 QuerySet이 리턴된다

 

get을 활용한 조회일 경우에는 QuerySet이 아닌 Question 모델 객체가 리턴된다

get은 한건만 리턴된다

get 조회시 조건에 맞는 데이터가 없을시 오류가 발생한다

 

더 다양한 데이터 조회시 filter 사용법은 공식문서를 참고하도록 하자

https://docs.djangoproject.com/en/4.0/topics/db/queries/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

Question 수정

이미 저장된 Question 데이터를 수정해 보자

>>> q = Question.objects.get(id=2)
>>> q

id 값이 2인 데이터를 조회

 

>>> q.subject = 'Django Model Question'

subject 속성을 수정

>>> q.save()
>>> q

save를 수행해야지만 변경된 데이터가 반영된다

 

Question 삭제

이번에는 id값이 1인 Question 데이터를 삭제해 보자

>>> q = Question.objects.get(id=1)
>>> q.delete()
>>> Question.objects.all()

 id값이 1인 Question 데이터가 삭제되어 조회되지 않는 것을 볼 수 있다

 

 

Answer 작성

답변 데이터를 생성해보자

>>> q = Question.objects.get(id=2)
>>> q

 id값이 2인 Question 데이터 지정

>>> from django.utils import timezone
>>> a = Answer(question=q, content='네 자동으로 생성됩니다.', create_date=timezone.now())
>>> a.save()

 id값이 2인 Question 데이터에 답변 작성

>>> a.id

유일값(PK)인 id가 자동으로 생성된 것을 볼 수 있다

 

Answer 조회

Question 데이터와 마찬가지로 id값을 사용하여 조회할 수 있다

>>> a = Answer.objects.get(id=1)
>>> a

 id값이 1인 Answer 데이터 조회

>>> a.question

어떠한 질문의 답변인지 Answer 모델에 question 속성이 연결되어 있기 때문에 같이 조회할 수 있다

>>> q.answer_set.all()

질문으로 답변을 찾는 것 또한 가능하다

이는 Quesion 모델에는 answer_set이라는 속성이 없지만 외래키(FK)로 연결되어 있어 가능하다

 

728x90
반응형

'Python > Django' 카테고리의 다른 글

[Django] 장고 View  (1) 2023.11.27
[Django] 장고 관리자(Admin)  (0) 2023.11.27
[Django] 장고 Model  (1) 2023.11.24
[Django] Django 기본 동작 및 구조 이해  (0) 2023.11.23
[Django] MVC 와 MVT  (0) 2023.11.16
Comments