django | 6. ORM

sojung·2021년 5월 27일
0

django

목록 보기
7/21
post-thumbnail

장고 셸 실행하기

Django ORM 사용을 위해 Python shell로 들어가기

$ python manage.py shell

파이썬 셸과 비슷해 보이지만, 장고 셸은 장고에 필요한 환경들이 자동으로 설정되어 실행되므로 파이선 셸과는 약간의 차이가 있다.

모델 임포트하기

Question 모델을 장고 셸에 임포트한다.

>>> from home.models import Question

home 앱 안에 있는 models에서 class Question 모델을 가지고 오라!!

데이터 만들기

Question 모델을 이용하여 Question 모델 데이터를 만든다.

1. create 함수 사용

>>> Question.objects.create(subject="math", content="어렵나요")

2. save 함수 사용

a = Question(subject="math", content="아냐 쉬워")
a.save()

데이터 조회하기

1. 데이터 모두 조회하기

장고에서 저장된 모델 데이터는 Question.objects를 사용하여 조회한다.

>>> Question.objects.all()


여기서 1은 장고에서 모델 데이터에 자동으로 입력해 준 id이다..

>>> Question.objects.values()

Question.objects.all()을 하면 데이터 유형을 출력한 것이므로 가독성이 떨어진다. 따라서 Question 모델에 str 메서드를 추가한다.

class Questio(models.Model):
  ...
  def __str__(self):
    return self.subject

모델이 수정되었으므로 장고 셸을 다시 시작한다. quit() 명령어를 입력하고, 장고 셸을 다시 시작-> 모델 import -> Question.objects.all()으로 데이터를 조회해보면

id가 아닌 subject로 데이터가 조회된다.

모델이 수정되었는데 왜 makemigrations, migrate 명령을 실행하지 않지?
makemigrations, migrate 명령은 모델의 속성이 추가되거나 변경된 경우에 실행하는 명령어이다. 지금은 메서드가 추가된 것이므로 이 과정은 불필요하다.


2. 조건으로 데이터 조회하기

id가 1인 객체를 조회하면

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

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

>>> Question.objects.filter(subject="math")

>>> Question.objects.get(subject="math")

는 에러가 발생한다. 두 개이상의 반환값이 있기 때문이다.

filter vs get
1. filter 함수는 조건에 해당하는 데이터를 모두 찾아준다. 지금은 유일한 값인 id를 조건에 사용했으므로 Question 모델 데이터가 하나만 나왔다. 하지만 filter 함수는 1개 이상의 데이터를 반환한다. 또한 반환값이 리스트 형태인 QuerySet이다.
2. get함수는 리스트가 아닌 데이터 하나만 조회할 수 있다. 단 한 건의 데이터만 반환한다.

>>> a = Question.objects.get(id=1)  
>>> a.subject
>>> a.content
>>> a.create_date



3. 조건에 맞지 않는 데이터 조회하기

id가 3인 데이터가 존재하지는 않지만 조회하면

get

>>> Question.objects.get(id=3)

에러가 발생한다. 조건에 맞는 데이터 1개를 반드시 반환해야 하는데, 조건에 맞는 데이터가 없으니 오류가 발생한 것이다.

filter

>>> Question.objects.filter(id=3)


filter 함수는 조건에 맞는 데이터가 없으면 빈 QuerySet을 반환한다.

4. 제목의 일부를 이용하여 데이터 조회하기

>>> Question.objects.filter(subject__contains="ma")

subject에 "ma"라는 문자열이 포함되어 있는가? 라고 해석할 수 있다.

장고 공식 문서(데이터 조회 관련)

데이터 수정하기

1. 데이터 조회

데이터를 수정하려면 먼저 조회를 해야한다. id=2인 데이터를 조회하자.

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

2. 데이터 수정

그리고 속성을 입력하여 수정하면 된다.

b.subject = "english"

3. 데이터 베이스에 저장

수정만 해서는 데이터 베이스에 적용되지 않는다. 반드시 save 함수를 실행해야 변경된 Question 모델 데이터가 데이터베이스에 반영된다.

b.save()

데이터 삭제하기

b = Question.objects.get(id=2)
b.delete()


해당 데이터가 데이터베이스에서 즉시 삭제되고, 삭제된 데이터의 추가 정보를 반환한다. 앞의 1은 삭제된 Question 모델 데이터의 id를 의미하고, 뒤에 있는 것은 삭제된 모델 데이터의 개수를 의미한다.

profile
걸음마코더

0개의 댓글