2 분 소요

모델 사용하기

이 글은 박응용 님의 wikidocs 의 점프 투 장고 교재를 학습하며 작성한 글 입니다.

데이터 생성

django shell 을 통해 모델을 사용해보자.

(venv) C:>python manage.py shell
Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

shell 명령어를 통해 django shell로 진입할 수 있다.

>>> from community.models import Question, Answer
>>> from django.utils import timezone
>>> q = Question(subject='첫 커뮤니티 제작한 기분은 ?', content='윤정호님의 기분이 궁금해영', create_date=timezone.now())
>>> q.save()
>>> q.id
1

그리고 위의 shell에서 python 코드를 작성하듯이 명령어를 입력해주면 된다.

django 내에선 SQL문을 거의 안 쓴다고 보면 된다.

DB에 직접적으로 접근하지 않으며 모델 객체로 ORM 방식을 이용하여 DB와 데이터를 주고 받는다.

위 코드에서도 SQL문 하나 없이 모델 객체만을 사용하여 데이터를 생성할 수 있다.

>>> q = Question(subject='장고를 어떻게 평가하나용?',content='윤정호님의 장고에 대한 생각이 궁금합니다.' ,create_date=timezone.now())
>>> q.save()
>>> q.id
2

하나의 데이터를 더 만들어보았다.

데이터 조회

각 데이터 모델은 데이터 모델명.objects.all()명령어를 통해 해당 모델이 포함하고 있는 전체 객체(데이터)를 확인할 수 있다.

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>

인덱스 넘버와 함께 객체에 대한 정보가 출력된다.

인덱스 넘버가 아니라 특정 칼럼에 대한 정보로 데이터를 확인하고 싶다면

model.py 에서 __str__ 함수를 통해 설정할 수 있다.

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

    def __str__(self):
        return self.subject
>>> from community.models import Question,Answer
>>> Question.objects.all()
<QuerySet [<Question: 첫 커뮤니티 제작한 기분은 ?>, <Question: 장고를 어떻게 평가하나용?>]>
>>>

shell 을 재시작 후에 다시 확인해보면 설정한 칼럼명 기준으로 출력되는 것을 확인할 수 있다.

**모델에 함수가 추가되었을 때는 migrate 명령이 필요 없다 **

>>> Question.objects.filter(id=1)
<QuerySet [<Question: 첫 커뮤니티 제작한 기분은 ?>]>
>>> Question.objects.get(id=1)
<Question: 첫 커뮤니티 제작한 기분은 ?>
>>> Question.objects.filter(subject__contains='장고')
<QuerySet [<Question: 장고를 어떻게 평가하나용?>]>

그리고 filter와 get 함수를 통해 조회가 가능하다.

여기서 중요한 점은 한 개의 데이터만 조회할 때만 get함수가 사용 가능하다.

filter 에 대한 공식문서는 아래 링크에서 확인해보자.

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

연결된 모델끼리의 조회의 경우

부모객체변수.자식모델명_set.all() 함수를 통해 외래키로 연결된 모든 것들을 조회할 수 있다.

데이터 수정

이제 데이터를 수정해보자. 데이터 수정또한 간단하다.

>>> q= Question.objects.get(id=1)
>>> q
<Question: 첫 커뮤니티 제작한 기분은 ?>

>>> q.subject = '오늘 기분 어떠십니까'
>>> q
<Question: 오늘 기분 어떠십니까>

>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: 오늘 기분 어떠십니까>, <Question: 장고를 어떻게 평가하나용?>]>




위처럼 객체를 변수에 저장하여 값을 변경할 수 있다.

q 에는 정보가 복사 되는 구조가 아니라 해당 데이터에 접근하는 포인터가 되는 거라고 이해하면 편하다.

데이터 삭제

데이터 삭제 또한 마찬가지로 변수에 조작하길 원하는 객체를 불러와 저장하고 해당 변수를 통해 조작하면 된다.

>>> q = Question.objects.get(id=2)
>>> q
<Question: 장고를 어떻게 평가하나용?>

>>> q.delete()
(1, {'community.Question': 1})

>>> Question.objects.all()
<QuerySet [<Question: 오늘 기분 어떠십니까>]>
>>>

위 코드로 간단하게 데이터를 지우고 지워진 데이터를 확인할 수 있다.

댓글남기기