Django에서 DB 사용하기
저번 TIL과 동일하게 user, tweet startingapp을 생성하고 실행을 시키면 자동으로 'db.sqlite3' 이라는 파일이 생성된다. DB Navigator를 이용하여 해당 DB를 연동시켜준다. (path 설정)
Django 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)
models.py를 다음과 같이 수정해보자. 클래스 Meta는 모델의 정보를 담고 있다. 이때는 테이블명만을 지정해주었다. Django에서는 여러 가지 model field를 제공해준다.
문자열 : CharField, TextField
날짜/시간: DateTimeField, DateField, TimeField
숫자 : IntegerField, FloatField
다른 테이블과 연관을 지어 줄 때 : ForeignKey
Django에서 제공하는 model field들인데, 이를 이용하여 위의 UserModel 클래스를 설명하자면, username은 문자열형이며 최대 20글자를 지원하며 null값을 인정하지 않고, password는 문자열형이며 최대 256글자를 지원하며 null값을 인정하지 않는다. bio는 문자열형이며 최대 256글자를 지원하며 초기값은 ''(빈 문자열) 이다. created_at과 updated_at은 날짜, 시간을 저장한다.
models.py를 모두 작성했다면, 터미널에
python manage.py makemigrations
명령어를 입력해준다. 그 후, 변경된 DB를 적용시켜주기 위해 터미널에
python manage.py migrate
명령어를 입력해준다. 그렇게 되면, Django가 자동으로 DB에 모델들을 생성시켜주는 것을 확인할 수 있다.
클래스의 상속
class A:
def a:
return "a"
class B:
def b:
return "b"
다음과 같이 클래스 A와 클래스 B가 있고, 클래스 A에는 함수 a가, 클래스 B에는 함수 b가 있다고 가정하자. 둘은 각각 다른 클래스이기 때문에 서로 영향을 미치지 않는다. 그렇다면 클래스 B에서 함수 a를 호출하고 싶다면 어떻게 하면 될까? 이때, 상속이라는 개념을 사용하는데 클래스 B가 클래스 A를 상속하게 되면, 클래스 B는 클래스 A의 기능을 사용할 수 있게 되는 것이다.
class A:
def a:
return "a"
class B(A):
def b:
return "b"
클래스 B가 클래스 A를 상속하는 코드는 다음과 같다. 클래스 B 선언 시, 괄호 안에 클래스 A의 이름을 써주게 되면, 클래스 B는 클래스 A의 기능을 사용할 수 있게 된다.
상속을 이용한 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)
원래 우리가 작성해둔 user/models.py 코드이다. UserModel 옆의 괄호에 models.Model이라는 인자가 들어가 있는 것을 확인할 수 있다. 즉, UserModel 클래스는 models.Model 클래스의 기능을 사용하고자 한다는 것이다.
이러한 상속을 이용하여 Django의 user model + 나만의 model 작업을 진행해보자.
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserModel(AbstractUser):
class Meta:
db_table = "my_user"
bio = models.TextField(max_length=500, blank=True)
다음과 같이 user/models.py를 작성해준다. Django는 기본적으로 auth_user를 사용자 관리 테이블로 지정해놓았기 때문에 우리가 만든 model로 바꾸기 위해선 Django에 알려주어야 한다.
AUTH_USER_MODEL = 'user.UserModel'
Django에 알려주기 위해 settings.py에 위의 코드를 추가해준다. 그 후, 터미널에 migration을 위한 코드를 작성해줌으로써 생성한 model을 DB에 알려준 후, views.py와 같은 코드를 수정하여 원하는 기능을 추가하면 된다.
DB의 관계
Django에서 모델을 작성하게 되면 테이블끼리 관계를 가지고 있는 것을 확인할 수 있다. 그 관계의 종류에 대해 알아보자.
One-to-Many 관계
One-to-Many 관계는 사용자와 게시글 관계라고 생각하면 간단하다. 하나의 게시글에는 한 명의 작성자만이 존재하지만, 한 명의 사용자(One)는 여러 개의 게시글(Many)을 쓸 수 있다. 이러한 관계를 One-to-Many 관계라고 한다.
One-to-One 관계
One-to-One 관계는 사용자와 프로필 관계라고 생각하면 간단하다. 한 명의 사용자(One)에는 하나의 프로필(One)만이 존재하고, 하나의 프로필(One)에는 한 명의 사용자(One)에 대한 정보만이 노출된다. 이러한 관계를 One-to-One 관계라고 한다.
Many-to-Many 관계
Many-to-Many 관계는 팔로우 팔로잉 관계라고 생각하면 간단하다. 한 명의 사용자는 여러 명(Many)을 팔로우할 수 있고, 여러 명(Many)에게 팔로잉될 수 있다. 이러한 관계를 Many-to-Many 관계라고 한다.
Many-to-Many 관계 연습해보기
피자와 피자 토핑 간의 관계로 Many-to-Many 관계를 연습해보기 위해서 restaurant라는 앱을 만들어보자.
from django.db import models
# Create your models here.
class MyTopping(models.Model):
class Meta:
db_table = "my_topping"
def __str__(self):
return self.topping_name
topping_name = models.CharField(max_length=100)
class MyPizza(models.Model):
class Meta:
db_table = "my_pizza"
def __str__(self):
return self.pizza_name
pizza_name = models.CharField(max_length=100)
pizza_topping = models.ManyToManyField(MyTopping)
models.py에 다음과 같이 MyTopping 클래스와 MyPizza 클래스를 작성해주자. 그리고, 터미널에 migrate 코드를 작성하여 모델을 DB에 알려준다.
이제, admin.py에 DB 모델을 추가해주고, admin 페이지에도 MyPizza와 MyTopping을 추가해준다.
from django.contrib import admin
from .models import MyTopping, MyPizza
# Register your models here.
admin.site.register(MyPizza)
admin.site.register(MyTopping)
코드를 추가한 후, Django를 실행시켜 admin 페이지로 이동하면 아래와 같은 화면을 볼 수 있다.
이제 admin에서 원하는 데이터를 추가하고 확인할 수 있다.