DB에 테이블 생성하기
DB에 테이블 생성하는 작업은
models.py
에 테이블 정의admins.py
에 테이블 등록- python manage.py makmigrations
- python manage.py migrate
이런 순서로 이루어진다. 순서대로 하나씩 보자.
테이블 정의
장고에서 테이블은 클래스로 정의한다.
from django.db import models
class Question(models.Model):
question_text = modesl.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
여기서 Question과 Choice는 1:N 관계에 있다. 한 Question에 여러 개의 Choice가 있는 형태인 것이다. Choice에서는 FK(Foreign Key)로 Question을 연결했다. 외래키(FK)는 참조하는 테이블의 기본키(PK)와 항상 연결되므로, Question의 id를 지정하여 연결할 필요 없이 그냥 Question 테이블 자체를 지정하면 된다.
Admin 사이트에 등록
from django.contrib import admin
from .models import Question, Choice
class QuestionAdmin(admin.ModelAdmin):
list_display = ('pk', 'question_text', 'pub_date')
class ChoiceAdmin(admin.ModelAdmin):
list_display = ('pk', 'question', 'choice_text', 'votes')
admin.site.register(Question,QuestionAdmin)
admin.site.register(Choice,ChoiceAdmin)
이렇게 등록하면 어드민 사이트에서도 확인할 수 있다. 만약 테이블 생성만 하고 admin.py에 이런 식으로 등록하지 않는다면 사이트에서 나타나지 않는다.
list_display는 sql 테이블처럼 데이터를 컬럼별로 보여주는 역할을 하므로 이 역시 등록해주는 것이 좋다.
vscode에서 테이블을 보고 싶으면
- 확장프로그램
SQLite
를 설치 - shift + control(맥은 command) + p 로 sqlite를 선택
- Open database
- 보고자 하는 app DB 선택
- 좌측 사이드바의 sqlite explorer에서 보고자 하는 테이블 선택 후 오른쪽 화살표 키를 누르면 테이블이 새 윈도우에 나타난다.
makemigrations, migrate
위 작업들을 통해 models.py와 admin.py를 모두 수정했으면
$ python manage.py makemigraions # 마이그레이션 파일 만듦
$ python manage.py migrate # DB에 테이블 생성
makemigrations 명령을 하면 myapp/migrations
에 새로운 파일이 생성된다. 0001_initial.py
이런 식으로. 생성된 파일을 열어보면 models.py에서 정의했던 모델이 있음을 확인할 수 있다. 이 파일들이 생성되면 migrate 명령을 통해 DB에 테이블이 만들어진다.
새 테이블이 생성될 때 테이블명은 [앱이름_테이블이름] 으로 만들어진다.
이제 테이블 생성이 완료되었고, 데이터를 조작하는 법을 알아보자.
파이썬 쉘로 데이터 조작하기
데이터를 조작은 Admin 사이트에서 GUI로도 할 수 있다. 다만 GUI는 보기 좋고 편리하지만 파이썬 쉘이 더 복잡하고 다양한 명령을 제공하므로 쉘 명령어를 알아보자.
먼저 파이썬 쉘을 킨다.
$ python manage.py shell
쉘이 가동되면 models.py에서 만들었던 클래스를 임포트해온다.
$ from myapp.models import Question
그 다음 인스턴스를 생성할 수 있다.
$ question = Question() # 또는
$ question = Question(question_txt='')
클래스를 이용해서 하는 주요 명령어는
-
Question.objects.get(pk=1) - 검색 결과 없으면 에러 리턴
-
Question.objects.filter(pk=1) - 검색 결과 없으면 빈 쿼리 리턴
-
Question.objects.filter(question_text__contains='first')
-
Question.objects.all()[1:3]
-
Question.objects.order_by('-pk')
정렬, 전체 데이터 뽑기, 일부 데이터 필터 등..
인스턴스로 하는 주요 명령어는
-
question.save()
인스턴스 생성할 시 저장해야 생성됨(Create), 저장 없이 생성하려면 Question.objects.create(question_text='')
-
question.delete()
-
question.question_txt = 'sth'
pk가 n인 인스턴스 불러와서 수정하기(Update)
-
question.full_clean()
데이터 유효성 검사
-
question.choice_set.all()
해당 레코드에 연결된 Choice 테이블의 레코드 모두. 그러니까 pk=1번 질문이면 pk=1인 question과 연결된 Choice 레코드 모두이다.
그런데 매번 쉘을 킬 때마다 모델을 임포트하는 과정이 매우 귀찮을 수 있다. 이때에는 장고 확장프로그램을 설치한다.
$ pip install django-extenstions
설치한 뒤 settings.py에서 INSTALLED_APP에 추가한다.
그 다음
$ python manage.py shell_plus
쉘_플러스 명령어를 치면 이제 모델 임포트하는 명령어 안써도 바로 모델 클래스 사용가능하다.