3. Django ORM & Database
1. Object Relational Mapping
객체와 관계형 database의 데이터를 자동으로 연결(매핑)해주는 것을 의미한다.
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 database는 테이블을 사용하는데 상호간에 불일치 오류가 존재한다.
이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 오류를 해결하는 것이다.
2. Database 연결하기
아마 이미 한번씩은 장고를 실행시켰을거라고 생간된다. 그러면 Project 구조를 보면 db.sqlite3 파일이 생겨있을탠데 이는 database가 연결되었음을 의미한다.
이후 Pycharm 우측의 database를 누른다.
+버튼을 누르고 Data Source from Path를 누른 후
프로젝트의 db.sqlite3 파일을 찾는다.
이후 Driver를 선택하라고 나오는데 우리는 sqlite를 활용하므로 해당 드라이버를 선택한다.
만약 처음 Django를 하는거면 아래와 같이 Download missing driver files가 나올탠데 이는 드라이버가 안깔려있는 사소한 문제이다. Download를 눌러 설치해주자. Name은 바꿔도 상관없고 경로는 Pycharm에서 알아서 설정해줄것이다.
이후 Apply후 OK를 누르면 하단과 같이 잘 나올것이다. 이때 main이 안보이는 사람이 있을탠데 db.sqlite3 옆에 1을 눌러서 All schemas에서 Default schemas를 누르면 나온다. 물론 main을 눌러도 나온다.
3. User Model 만들기
Django는 기본적으로 User모델을 제공한다. 사용자의 관리와 로그인/로그아웃이 이미 다 구현이 되어있다.(djanog.contrib.auth)
하지만 직접 만들어봄으로써 구조의 이해를 해보고자 한다.
1) User에 필요한 정보 구성
- 사용자 이름, 비밀번호, 상태메시지, 생성 시기, 업데이트 시기
- 작성하는 곳 user/models.py
from django.db import models
# Create your models here.
class UserModel(models.Model):
class Meta:
db_table = "my_user"
username = models.CharField(max_length=20, null=False)
password = models.CharField(max_length=256, null=False)
bio = models.CharField(max_length=256, default='')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
- Meta?
- class Meta는 모델의 정보를 담고 있다. db에 table 이름을 my_user로 지정해준다.
- Field?
- Field는 데이터가 들어가는 방식이다.
- 문자열 : CharFieldTextField
- 날짜/시간: DateTimeField, DateField, TimeField
- 숫자 : IntegerField, FloatField
- 다른 테이블과 연관을 지어 줄 때 : ForeignKey
- https://docs.djangoproject.com/en/4.0/ref/models/fields/
2) 만든 모델을 데이터베이스에 넣는 법
- makemigrations - 데이터베이스 변경을 알려주는 명령어
터미널에 하단의 코드를 작성한다.
python manage.py makemigrations
해당 결과값이 출력이 된다.
Migrations for 'user':
user\migrations\0001_initial.py
- Create model UserModel
만약 No change detected가 나오면 높은 확률로 settings.py에 생성한 app을 추가 안해줘서 나온 문제이다.
- migrate - 변경 된 데이터베이스를 적용시키는 명령어
위에서 만든걸 적용시켜줘야한다.
python manage.py migrate
마찬가지로 해당 결과물이 출력된다.
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying user.0001_initial... OK
맨 마지막 줄을 보면 user앱에서 만든 모델이 적용됨을 볼 수 있다.
- 확인
main/tables에서 my_user(아까 위에서 Meta를 통해 설정한 이름)가 생성되었음을 볼 수 있다.
columns를 보면 설정한 값들이 적용됨을 알 수 있는데 id의 경우 Django에서 자체적으로 설정해주는 것이다.
Tip. 보통은 Django가 주는 기본 옵션들을 잘 사용 안한다. 특히, User의 경우 커스텀 하는 경우가 대부분이다. 생각을 해보면 기업체 따라 User에 넣어줘야하는 기능이 다를것이다. 그리고 table를 바꾸기 힘들기에 처음부터 커스텀 하는게 좋다. 우선은 커스텀 User를 만들지 않았기에 링크를 남겨두겠다.
Django 커스텀 유저 모델(Custom User Model)
Django Custom Model
hckcksrl.medium.com