TIL - Wecode | Django C.R.U.D - 1

한성봉·2021년 5월 22일

Django C.R.U.D

CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.

초기세팅이 완료되었다면 C.R.U.D를 실습을 한번 해보자. 우선 앞에서 장고 프로젝트를 하기위한 초기세팅은 끝났다면 우리는 app을 만들어야한다. 웹사이트의 정보를 따로 분류해둔 응용 프로그램이라고 생각하면 될 것입니다. 제품 데이터를 모아놓은 app, 로그인 데이터를 모아놓은 app, 결제 데이터를 모아놓은 app 등 웹사이트에 필요한 방대한 양의 데이트를 기능별로 분류해둔다고 생각하면 될 것입니다.

먼저 데이터베이스 application을 생성해보겠습니다.


DATABASE Table 생성

1. database application 생성

python manage.py startapp <app이름> # products

항상 manage.py가 존재하는 폴더 안에서 실행해야합니다.
나는 제품 app 을 만들고 싶어서 app이름을 products로 생성하였습니다.
위의 명령어를 실행하면 자동으로 products 라는 폴더가 생성됩니다.
안에는 데이터베이스를 사용하기 위한 파일들이 존재합니다.

2. settings.py에 app 추가하기

# settings.py

INSTALLED_APPS = [
	...
	'products',
]

app 을 추가했으면 장고 프로젝트의 핵심인 settings.py가 알아야하니 안에 추가해줘야합니다. 중요!!

3. 장고 초기 셋팅 완료 후 오류 검증

python manage.py runserver

runserver를 통해 오류검증을 해야합니다. 오류가 뜬다면 오타거나 초기세팅에 문제가 있다는 뜻이니 문제가되는 부분을 찾아 고쳐야합니다.

이런 글이 뜬다면 오류검증이 완료되었다는 뜻입니다. 만약 다음과 같은 사진이 뜬다면 크게 신경쓰지 않아도 됩니다. 현재 마이그레이션해야할 데이터가 있으니 마이그레이션하라는 의미입니다. 마이그레이션은 밑에서 언급하도록하겠습니다.

4. models.py 에 테이블 생성하기
models.py 에 데이터베이스에 저장될 테이블을 파이썬의 class형태로 저장하면 됩니다.

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = 'menus'

class Category(models.Model):
    name = models.CharField(max_length=20)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

    class Meta:
        db_table = 'categories'

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)

    class Meta:
        db_table = 'products'

다음과 같이 class 하나하나 가 데이터베이스의 테이블이 되는 것입니다.
현재 menu,category, product 테이블을 생성하는 class를 코드로 작성한 것입니다.

우리는 테이블 하나하나 추가해보도록 하겠습니다.

5. 생성한 table migration 하기

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=20)

    class Meta:
        db_table = 'menus'

우선 Menu라는 테이블 한개 먼저 migration 해보겠습니다. 잠시 위의 클래스를 설명하자면 name은 우리가 만들었다 column입니다. 원래 id도 있는데 이것은 장고 기능 중 자동으로 AI(Auto Increment)해주기 때문에 id 필드는 별로 작성하지 않아도 됩니다.

CharField는 sql상에서 VarChar와 같은 의미입니다.
그리고 자식 클래스를 한개 더 넣어줬는데 db_table 상에서의 이름을 한번 지정해주는 클래스입니다.

테이블을 클래스로 작성했다면 지금부터 마이그레이션을 진행하면 됩니다.

6. migration 하기
migration은 총 2단계로 진행하면 됩니다.

  1. python manage.py makemigrations
  2. python manage.py migrate

생성할 테이블을 만들때 마다 위의 2단계를 진행해주면 됩니다.

이후 mysql상에서

SHOW TABLES;

menus 테이블이 잘 들어간 것을 볼 수 있습니다. 저는 다른 테이블도 진행했기 때문에 다른 테이블도 보이지만 menu 테이블 한개만 넣었다면 django 테이블과 menu 테이블 한개만 나올 것입니다.

이런 방식으로 원하는 테이블을 넣으면 되겠습니다. 1대다 형식의 테이블을 한개만 더 넣어보겠습니다. FK(foreign key:외래키)를 이용하는 방법에 대해 알아보겠습니다.

7. FK(foreign key:외래키) 테이블 넣기

class Menu(models.Model):
    name = models.CharField(max_length=20)
    
    class Meta:
        db_table = 'menus'

class Category(models.Model):
    name = models.CharField(max_length=20)
    menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

    class Meta:
        db_table = 'categories'
  • menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

menu 1 : N(다) category 형식의 테이블은 다음과 같이 참조를 해야 하는 외래키를 가지고있는 테이블에 ForeignKey 코드를 작성해줘야합니다.

테이블을 하나더 만든 뒤 똑같이 2단계 migration 작업을 거쳐주면 table이 생성됩니다.

#mysql

DESC categories;

위의 명령어는 테이블 내에 상세정보를 보여주는 명령어입니다.

우리가 생성한 column도 보이고 id는 자동으로 생성된 것을 볼 수 있습니다. menu를 FK로 생성했는데 필드 이름이 menu_id로 바뀐 것을 볼 수 있습니다. 이처럼 FK로 참조하게 되면 자동으로 menu_id라고 표시되고 참조되었다는 것을 뜻합니다.

key에 보면 id는 PRI=Primary key, MUL=ForeignKey를 뜻합니다. 원하는대로 테이블이 잘 생성된 것을 볼 수 있습니다.

# mysql
SELECT * FROM categories;

내가 추가한 자료들을 보는 명령어이다. 하지만 지금은 추가한 자료가 없으니 Empty set이라고 출력될 것이다.


C.R.U.D

C.R.U.D 중 C(create)를 해보자.
우선 우리는 데이터를 C.R.U.D 하기 위해서 python shell을 사용해야한다.

1. ipython 설치
기존 파이썬 shell을 사용해도 되지만 ipython이라는 패키지를 사용해 조금더 GUI 환경이 가미된 shell로 작업해보자.

pip install ipython

이후 ipython 명령어 입력하면 ipython shell 이 실행된다.

하지만 우리는 django 프로젝트 프레임워크를 사용해 진행중이기 때문에 장고 기능을 쓸 수 있도록 ipython에 진입해야한다.

python manage.py shell

다음 명령어를 실행하면 자동으로 ipython이 열린다.

2. CREATE
우리는 테이블에 정보를 생성하기 전에 models.py 에서 테이블형식으로 저장한 class를 불러와야한다. (import)해야한다는 의미이다.

# python shell
from products.models import Menu

사용하고 싶은 class 를 import 해주면된다.

테이블에 데이터를 생성해보자.

# python shell
Menu.objects.create(name='음료')

테이블에 데이터를 create했다.

다음과 같이 행열의 정보를 알고 싶다면 다음 명령어를 사용하자.

# mysql
SELECT * FROM Menus;

3. READ

# python shell
Menu.objects.get(name='음료') # <Menu: Menu object (1)>
Menu.objects.all() # <QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>, <Menu: Menu object (3)>, <Menu: Menu object (4)>]>

READ를 하는 방법에는 여러가지가 있다. 오늘 그 중 2가지 get, all을 써서 가져와보자. get 그 값 딱 하나만 가져온다. 데이터 요청을 받을 때 딱 하나만 가져와하는 상황에서 쓰면 유용하다. 예를 들어 로그인 정보를 가지고 올때 해당 아이디와 패스워드에 부합하는 회원은 한명이므로 get을 활용하면 되겠다. all 은 모든 데이터를 가져오고 리스트형태로 반환된다.

만약 FK를 가지고 있는 테이블에 PK의 참조를 python shell에서 추가할려면 다음과 같이 해야한다.

drinks = Menu.objects.get(naem='음료')
# <Menu: Menu object (1)>

drinks란 변수에 <Menu: Menu object (1)> 값이 저장된다. id=1 row의 음료라는 column값을 변수에 저장하고 FK가 참조할 수 있도록 하겠다는 의미이다.

Category.objects.create(name='콜드 브루', menu=drinks)

이렇게 하면 menu의 id=1 인 값 음료를 참조해 콜드 브루가 menu_id = 1 을 참조한다.

0개의 댓글