Back-end/Python

[Python]장고 앱 생성 ch2. DB, model 생성.

cheersHena 2018. 3. 20. 22:34
반응형

* Django에서 DB는 기본적으로 SQlite 를 사용한다. SQlite는 python에서 기본적으로 제공된다.


1. 데이터베이스 설치.


처음 migrate 할때는 앱이름 명시 하지 않음. 기본적으로 설치된 앱에 걸쳐 적용할 migrate가 있기 때문.

python manage.py migrate

migrate 명령: installed_APPS 설정 탐색하여, DB 반영. 즉, migrate명령은 installed_APPS에 등록된 앱에 한해 실행되어짐.


*관련 명령어


python manage.py makemigrations (APP-NAME) #마이그레이션 파일 생성


python manage.py migrate (APP-NAME) #마이그레이션 적용


python manage.py showmigrations (APP-NAME) #마이그레이션 적용 현황


python manage.py sqlmigrate (APP-NAME) (migration-NAME)


2. 모델 만들기. *모델: 데이터베이스의 구조. 

필자는 예제로 사진(Image), 댓글(Comment) 두개의 모델을 먼저 생성해 보겠다.


images/models.py

class Image(models.Model):
file = models.FileField(max_length=50) #파일필드

class Comment(models.Model):
message = models.TextField() #텍스트필드



3. 모델 활성화.


먼저 ,  현 project 에게 images app 이 설치 되어 있다는 것을 알려야 함. 이를 위해 세팅의 설치앱 목록에 images 추가

helloworld/settings.py

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',

'images',

]

이제 장고는 images app이 포함된것을 알게 됨. 이제 다른 명령을 내려보자.


python manage.py makemigrations images

makemigrations :모델을 생성하거나 변경시킨 사항을 migration 으로 저장시키고 싶다는 것을 Django 에게 알려준다.



python manage.py sqlmigrate images 0001(migration-name)

sqlmigrate : migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여줌.


최종 확인 후, migrate를 실행시켜, DB에 반영. -> DB에 테이블 생성.



* 즉, 모델 생성부터 DB반영까지의  3단계

1)  models.py 에서 모델 생성 또는 변경

2) python manage.py makemigrations : 변경사항에 대한 migration 생성

3) python manage.py migrate : 변경사항 DB에 최종 반영.


*장고 어드민에서 관리하려면 어드민에 모델 추가. 


admin.py

from django.contrib import admin
from . import models #모델임폴트.
# Register your models here.

admin.site.register(models.Image)
admin.site.register(models.Comment)
admin.site.register(models.Like)


모델 예시.

from django.db import models
from django.contrib.auth.models import User #유저임폴트
# Create your models here.
class Image(models.Model):
file = models.FileField(max_length=50,null=True) #사진파일
location = models.CharField(max_length=50,null=True) #위치
caption = models.TextField(null=True) #캡션
created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True) #생성자 :외래키-유저ID
updated_at = models.DateTimeField(auto_now=True) #수정일
created_at = models.DateTimeField(auto_now_add=True,null=True) #생성일
def __str__(self):
return f'{self.location} , {self.caption}' #나타낼 필드설정(장소,캡션)

class Comment(models.Model):
message = models.TextField() #메세지(댓글내용)
created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True) #생성자 : 외래키-유저id
created_for = models.ForeignKey(Image, on_delete=models.CASCADE, null=True) #댓글다는 사진.:외래키-이미지
updated_at = models.DateTimeField(auto_now=True) #수정일
created_at = models.DateTimeField(auto_now_add=True,null=True)#생성일
def __str__(self):
return f'{self.created_for} - {self.message}' #나타낼 필드(메세지남길사진-메세지)

class Like(models.Model):
created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True) #생성자
created_for = models.ForeignKey(Image, on_delete=models.CASCADE, null=True) #좋아요한사진
created_at = models.DateTimeField(auto_now_add=True,null=True) #생성일
def __str__(self):
return f'{self.created_for}' #나타낼필드 (좋아요 누를 사진)


반응형