CS/Web

[BE-Django] model

뚱요 2021. 12. 6. 00:00
반응형

model로 데이터베이스 처리하면 SQL쿼리문 없이도 데이터 처리 가능해진다.

 

실행시 나오는 메시지 중  일부에서 migration을 적용하면 데이터베이스와 관련된 admin, auth, contenttypes, sessions. 앱들을 사용 할 수 있다고 나온다.

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.
*참고로  filename에서 board로 이름 변경함..

config/setting.py

데이터 베이스 엔진은 sqlite3, 해당 디렉토리에 'db.sqlite3 로 저장되어 있다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }

1. migration을 적용하기

python manage.py migrate

2. ORM 활용하여 모델 만들기

앱/models.py에 ERD 설계에 맞춰서 모델을 클래스와 속성으로 넣어준다.

속성 https://docs.djangoproject.com/en/3.0/ref/models/fields/#field-types

3. 모델 생성

makemigrations

모델 생성/업데이트

 python manage.py makemigrations

0001_initial.py생성됨

 

sqlmigrate

보드 앱에서 0001 작업파일의 쿼리를 조회

python manage.py sqlmigrate board 0001

 

migrate

쿼리문에 맞춰 테이블 생성

python manage.py migrate

4. 모델 CRUD

django shell 로 CRUD하기

4.0) django shell 실행

python manage.py shell

종료방법은 quit()

4.1 CREATE 생성하기

from board.models import Question, Answer
from django.utils import timezone

q = Question(subject='제목', content='내용을 넣어주세요', create_date=timezone.now())
q.save()
a = Answer(question=q, content='질문에 대한 답변 내용입니다.', create_date=timezone.now())
a.save()
print(q.id, q.subject , q.content , q.create_date)
# 1 제목 내용을 넣어주세요 2021-12-05 09:12:04.495313+00:00

#id는 모델 생성시에 자동으로 증가(autoincrement)하도록 설정함

4.2 READ  조회하기

Question.objects
#<django.db.models.manager.Manager object at 0x7f95fb000c10>

모델의 데이터는 모델.objects 를 통해서 조회

(1) 모든 데이터를 조회

모델.objects.all()

Question.objects.all()
#<QuerySet [<Question: Question object (1)>]>
#<QuerySet [<Question: 제목>]>

결과값: QuerySet 객체가 리턴 ( 포함하는 객체와 id 가 보인다.)

모델에__str__ 메서드 정의한 경우  id 값 대신 이제 제목이 표시

(2)id 조회

모델.objects.filter

해당하는 모든 데이터를 쿼리 셋에 리턴

Question.objects.filter(id=1)
<QuerySet [<Question: 제목>]>

모델.objects.get

유일한 값일 경우에만 가능하며 1개의 모델 객체만 리턴한

Question.objects.get(id=1)
#<Question: 제목>

외래키모델.연결된 모델명_set.all

정의된 속성은 아니지만 모델에 외래키로 연결된 모델로부터 접근 가능

q.answer_set.all()
#<QuerySet [<Answer: Answer object (1)>]>

(3)  단어 키워드 조회

모델.objects.filter(속성__contains= '키워드')

Question.objects.filter(content__contains='내용')
#<QuerySet [<Question: 제목>]>
Question.objects.filter(subject__contains='제')
#<QuerySet [<Question: 제목>]>
Question.objects.filter(subject__contains='와우')
<QuerySet []>

해당 키워드를 갖지 않으면 빈 쿼리셋을 리턴

4.3 UPDATE  수정

q= Question.objects.get(id=1)
q.subject='title'
q.content='your issues '
q.save()
q
#<Question: title>

4.4 DELETE  삭제

q= Question.objects.get(id=1)
q.delete()
Question.objects.all()
#<QuerySet []>
반응형