[TIL] Django CRUD1

Jene Hojin Choi·2021년 1월 26일
1

Django

목록 보기
1/12
post-thumbnail

이 글을 보시는 분이라면 notion에 있는 초기세팅은 기본으로 하셨기를 바랍니다...
왜냐면 그런 부분은 설명을 생략했거든요. 꿀팁을 얻으시고 싶을때 보시길.. 총총...

1. CRUD

우리가 만드는 API 모델은 다음과 같은 4가지의 기능을 구현할 수 있어야한다:

  1. Create : 데이터 생성(POST)
  2. Read : 데이터 조회(GET)
  3. Update : 데이터 수정(PUT, PATCH)
  4. Delete : 데이터 삭제(DELETE)

이 4가지 기능을 합쳐 CRUD라고 부른다. 앞서 보았듯이, CRUD 의 HTTP Method(POST, GET, PUT(/PATCH), DELETE)과 연결되어있다.

2. Django

2-1. ORM (object relational mapping)

Django에서 제일 키 포인트란 ORM일 것이다. Django는 데이터베이스의 테이블에 해당하는 것을 하나의 클래스로 만들수 있게 해준다.
즉, 데이터 베이스에 있는 SQL의 테이블을 Model에 있는 python의 class로 번역해주는 것이다. 쉽게 말하면 번역기이다.

2-2. Design Pattern: MVT

그러면 Django란 무엇일까?
장고는 파이썬으로 작성된 오픈 소스 웹 프레임워크로, MVT (Model-View-Template) 패턴을 따르고 있다.

  1. 위의 사진과 같이 클라이언트의 요청을 URLconf를 통해 View 가 받고, View에서 해당 요청에 대한 처리를 한다.
  2. 그러면서 Model에 있는 데이터를 CRUD의 기능을 이용하여 결과를 받는다.
  3. Model은 DB에 ORM기법을 사용하여 DB 테이블을 생성한다.
  4. 이렇게 가공된 데이터로 view에서 business logic을 수행하며 그 결과 값을 template에 만들어 클라이언트의 요청에 응답한다.

그리고 Model, View, URLconf는 다음 파일들과 연결되어있다:

  • Model : models.py
  • View : view.py
  • URLconf : urls.py

3. CRUD1. 간단한 Model 만들기

다음과 같이 생긴 데이터가 있다고 가정해보자!

초기 세팅

가상환경 세팅, settings.py 설정, mysql 데이터베이스와 연동을 하고,
app이름은 products, project이름은 westarbucks으로 시작한 상황이다!
notion에 보면 잘 나와있으니 스킵하도록 하겠다.

Model - models.py

Model에서는 앞서 말했듯 데이터를 class의 기반으로 바꾸어준다.

from django.db import models

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

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

class Product(models.Model):
	name  = models.CharField(max_length=100)
	price = models.IntegerField()
	menu  = models.ForeignKey('Menu', on_delete=models.CASCADE)

✅ Keypoints

  • class 하나가 테이블 하나이고, class 안의 attribute가 테이블의 column이다.

  • instance는 row이다.

  • db의 데이터 타입에 따라 models.py에서도 필드를 정해주어야한다.
    e.g.) VARCHAR -> CharField / INT -> IntegerField

  • class 이름은 단수로 설정하는 것이 convention이다!

  • foreign key를 받아올때 id를 붙이지 않는다. 알아서 참조할때 연결이 된다.
    e.g.) menu_id 대신에 menu 라고 하고 받아온다.

  • on_delete=models.CASCADE 는 참조된 object가 없어지면 그 row는 통째로 날리는 것을 의미한다.

Class.objects.create

파이썬 shell을 열어서 필요한 class들을 products의 models.py에서 import한다.

python manage.py shell
from products.models import Menu, Category, Product

classname.objects.create(...)를 이용하여 데이터 테이블에 데이터를 넣어줄 수 있다.

Menu.objects.create(name='커피')
Category.objects.create(name='콜드브루', menu_id=1)
Product.objects.create(name='나이트로 바닐라 크림', price=5400, menu_id=1)

✅ Keypoint

  • create할때 반드시 foreign key를 쓰지 않는 테이블부터 만든다.
    e.g.) menu는 아무것도 참조하지 않으므로 먼저 만들어준다.
    category, product는 menu_id를 참조하므로 나중에 만든다.

Check data in SQL

>> SELECT * FROM products_menu;
+----+---------+
| id | name    |
+----+---------+
|  1 | 커피     |
+----+---------+

>> SELECT * FROM products_category;
+----+---------+
| id | name     |
+----+---------+
|  1 | 콜드브루   |
+----+---------+

>> SELECT * FROM products_product;
+----+--------------------------------+-------+---------+
| id | name                           | price | menu_id |
+----+--------------------------------+-------+---------+
| 1 | 나이트로 바닐라 크림                 |  5400 |       1 |
+----+--------------------------------+-------+---------+

4. Challenge: Access data with foreign key

승현 멘토님이 던져주신 challenge를 풀어봅시다....

저의 답!

product1 = Product.objects.get(name=“나이트로 바닐라 크림“)
product1.category.name

product가 category를 참조하고 있는데 그걸 그냥 .category.name으로 access하면 category의 이름을 가져올 수 있다! 넘나 신기...

3개의 댓글

comment-user-thumbnail
2021년 1월 27일

잘보고 갑니다 호진님~ ><

답글 달기
comment-user-thumbnail
2021년 1월 28일

오우 챌린지 바로 성공하셨네요 호진님 넘나 신기 ... 화이팅 !!

1개의 답글