DB 모델링
DB 모델링은 어떤 Item의 데이터 포맷을 사전에 정의하는 것이다. 예를 들어 Job이라는 테이블이 있다면 하나의 row가 특정 job을 표현하는 속성이 된다. 그 속성에는 산업구분, 연봉, 근무지 등이 있을 것이고 이 속성들이 어떤 규격화된 정보를 담고 있을지를 미리 정하는 것이다. 데이터를 미리 정하는것이 아니라 데이터의 포맷을 정한다.
Django 모델링
Django에서는 id라는 column이 기본 값(primary key)으로 따로 정의해주지 않아도 자동으로 생성된다. 한 테이블 안에서 primary key는 하나밖에 사용하지 못하므로 id말고 다른 키를 primary key로 사용하고 싶으면 primarykey=True 옵션을 주어서 사용해야 한다. 외래키 (foreign key)는 xxx_id와 같이 자동으로 생성된다.
Django DB column type
- CharField (길이가 정해진 문자열)
- IntegerField (-2147483648 ~ 2147483647)
- PositiveIntegerField (양수만 사용)
- BigIntegerField (-9223372036854775808 ~ 9223372036854775807)
- Django의 primary key
- PositiveBigIntegerField
- DateField (날짜)
- DatetimeField (날짜 + 시간)
- BooleanField (True:1/False:0)
- TextField (길이가 정해지지 않은 문자열)
- EmailField (이메일 포멧)
- JSONField (Json 포멧) - JSON을 통째로 넣을 수 있음
- AutoField (Auto Increment 필드 with IntegerField)
- BigAutoField (Auto Increment 필드 with BigIntegerField)
- ForeignKey (다른 테이블 PK 참조 필드)
Django 모델링 하기
Django는 처음에 migration하면 User Table을 자동으로 만들어준다. 즉, Django가 사용할 기본 데이터 베이스를 생성한다.
python manage.py migrate
migrate를 해주면 Sqlite3파일이 생성된다. 앞으로 우리가 장고 프로젝트에 생성하는 데이터는 여기에 저장된다.
다음으로 우리가 만들고 싶은 테이블을 models.py 에 정의하고 migrate를 해준다.
from django.db import models
# Create your models here.
class PayPlan(models.Model):
name = models.CharField(max_length=20)
price = models.IntegerField()
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
python manage.py makemigrations
python manage.py migrate
이제 DB에 접근하기 위해 superuser를 만들어 준다.
python manage.py createsuperuser
superuser가 만들어진 위치를 확인하기 위해 DBeaver를 설치해준다. https://dbeaver.io/ DBeaver를 설치한 다음에 좌측 상단 +이이폰을 클릭해서 sqlite를 선택하여 DB를 연결시켜 준다.
연결되면 아래와 같이 db를 확인할 수 있다.
auth_user에 보면 우리가 만든 superuser가 있다. auth_ 로 시작하는 것은 인증을 사용하기 위해 사용하는 DB이고, django_로 시작하는 것은 장고가 직접 사용하는 DB들이다.
Django admin에서도 확인가능하다. http://127.0.0.1:8000/admin/auth/user/
migrations 폴더 안에 있는 models.py를 수정하여 user를 만들수 있다.
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import User
# Create your models here.
class PayPlan(models.Model):
name = models.CharField(max_length=20)
price = models.IntegerField()
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
# AbstractUser는 중간에 바꾸기 어렵기 떄문에 처음에 선언해주는 게 좋음
# settings.py에 AUTH_USER_MODEL 추가 필요
class Users(AbstractUser):
pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING)
class UserDetail(models.Model):
user = models.OneToOneField(Users, on_delete=models.CASCADE)
pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING)