지난 번 기초적인 장고 웹서버 세팅을 살펴봤습니다. 이번에는 본격적으로 데이터베이스 관리를 위한 설정을 진행하려고 합니다.
first 폴더 안에 있는 settings.py를 클릭하고 다음과 같이 INSTALLED_APPS에 myapp.apps.MyappConfig를 추가해줍니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp.apps.MyappConfig'
]
데이터베이스를 관리할 때 기본적으로 SQL을 사용하기도 하지만 장고는 ORM(Object-Relational Mapping)을 지원합니다. 저는 SQL을 제대로 배워본 적이 없어 장고가 지원하는 ORM을 통해 DB 관리를 진행하도록 하겠습니다. 아래와 같이 myapp 폴더 안에 있는 models.py에서 class Post를 선언해주고 그 안에 각 항목에 맞게 models의 모듈 Field를 불러옵니다.(필요한 필드는 장고 documentation에서 참고)
from django.db import models
# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=50) # CharField의 경우, 적절한 길이의 스트링에 적합
content = models.TextField()
create_date = models.DateTimeField(auto_now_add=True)
modify_date = models.DateTimeField(auto_now=True)
# auto_now_add=True: 처음에 add될 때, 자동으로 날짜 필드를 채워주기
# auto_now=True: 처음 추가될 때뿐만 아니라, 값이 변경될 때 자동으로 맞춰 저장해주기
migrations는 데이터베이스 상태를 기록하는 공간, 즉 히스토리를 확인할 수 있어 매우 유용합니다. python manage.py makemigrations 명령어를 통해 migration 파일을 생성할 수 있습니다. 이후에는 python manage.py migration 을 통해 실제 데이터베이스에 적용해줍니다.
python manage.py shell 을 입력하면 장고를 테스트할 수 있는 파이썬 환경이 시작됩니다.
>>> from myapp.models import Post
>>> Post.objects.create(title='제목을 입력해주세요', content='내용을 입력해주세요')
quit()를 통해 파이썬 환경에서 빠져나온 뒤 models.py를 클릭하여 class Post 안에 아래와 같이 __str__ 스페셜 메서드를 입력해줍니다. 이는 쉽게 말해 각 데이터를 구분해주는 역할을 합니다. 아래에선 데이터의 title과 create_date 라는 변수가 출력되어 데이터 간 identify 해주는 것이죠.
def __str__(self):
return self.title + str(self.create_date)
다시 파이썬 환경에 진입한 뒤 아래의 명령어를 단계별로 입력해보면서 출력값을 살펴보시기 바랍니다.
>>> from myapp.models import Post
>>> Post.objects.all()
>>> a = Post.objects.first()
>>> a
>>> a.title
>>> a.content
>>> a.create_date
>>> p.content = '내용 수정 테스트'
>>> p.save() # 내용 수정한 후 save를 해야 반영됩니다.
>>> p.content
>>> post = {'title': '다음 제목을 입력해주세요', 'content': '내일은 elasticsearch를 해결했으면 좋겠습니다'}
>>> post
>>> Post.objects.create(**post) # unpacking 이용해서 전에 선언한 post 가리킴
>>> Post.objects.all()
맨 마지막 줄 Post.objects.all()을 입력하면 이전에 생성했던 Post 객체까지 나올 것입니다. 쉽게 설명하면 현재 우리가 구축하고 있는 DB 형태는 다음과 같은 테이블 형식이며 우리는 row를 정해주고 있는 것이죠.
객체 | title | content | create_date | modify_date |
1 | 제목을 입력해주세요 | 내용을 입력해주세요 | ... | ... |
2 | 다음 제목을 입력해주세요 | 내일은 elasticsearch를 해결했으면 좋겠습니다 | ... | ... |
3 | ... | ... | ... | ... |
Post.objects.all() 출력 형태는 QuerySet인데요, 리스트나 딕셔너리처럼 for 문을 돌릴 수 있습니다. 참고로 Post.objects.filter() 역시 출력 형태가 QuerySet이며 여러 개의 객체를 출력할 수 있습니다. 반면에, Post.objects.get()의 경우는 1개의 객체 출력만 가능합니다.
>>> for post in Post.objects.all():
print(post)
>>> a1 = Post.objects.first()#첫 번째 객체
>>> a2 = Post.objects.last() #두 번째 객체
>>> Post.objects.get(id=1) == a1
>>> Post.objects.get(id=2) == a2
>>> Post.objects.filter(id=1)
>>> Post.objects.filter() # 조건이 없다면 모든 데이터 출력
>>> Post.objects.filter(create_date__year=2020)
>>> Post.objects.filter(title__startswith='제목')
'문돌이 존버 > Django 스터디' 카테고리의 다른 글
Mac 버전 장고 웹페이지 http request (1) | 2020.06.20 |
---|---|
Mac 버전 장고 데이터베이스 관리 3탄 (1) | 2020.06.20 |
Mac 버전 장고 데이터베이스 관리 2탄 (0) | 2020.06.20 |
Mac 버전 장고(Django) 웹서버 기본 세팅 (0) | 2020.06.19 |
Mac 버전 파이썬 가상환경 + 장고 웹서버 설정하기 (0) | 2020.06.16 |